{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 以下教程基于各官网教程\n",
    "--------------------------------------------\n",
    "[Numpy教程](https://docs.scipy.org/doc/numpy/user/quickstart.html)  \n",
    "[Matlab转Numpy](https://docs.scipy.org/doc/numpy/user/numpy-for-matlab-users.html)  \n",
    "[matplotlib教程](https://matplotlib.org/tutorials/index.html)  \n",
    "[pandas数据结构简介](https://pandas.pydata.org/pandas-docs/stable/getting_started/dsintro.html)  \n",
    "[pandas十分钟教程](https://pandas.pydata.org/pandas-docs/stable/getting_started/10min.html)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Numpy基本"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 基本概念"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "numpy的数组(ndarray)的维度称之为轴（axes），一维数组称之为有一个轴，二维数组有两个轴，以此类推，比如  \n",
    "`[[1,2,3],  \n",
    "[4,5,6]]`  \n",
    " 有两个轴，第一个轴长度为2，第二个轴长度为3"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "以下为`numpy.ndarray`(别名`numpy.array`)中数组的基本属性:  \n",
    "`ndarray.ndim`——数组轴数  \n",
    "`ndarray.shape`——数组各轴的长度，返回的元组各元素表示数组各轴长度，元组长度即为数组轴数  \n",
    "`ndarray.size`——数组中元素总个数  \n",
    "`ndarray.dtype`——数组中元素类型  \n",
    "`ndarray.itemsize`——数组中每个元素所占内存的大小  \n",
    "`ndarray.data`——数组中保存的原始数据，通常不需要这种方式来访问数组数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 0,  1,  2,  3,  4],\n",
       "       [ 5,  6,  7,  8,  9],\n",
       "       [10, 11, 12, 13, 14]])"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import numpy as np\n",
    "a=np.arange(15).reshape(3,5)\n",
    "a"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a.ndim"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(3, 5)"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'int32'"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a.dtype.name"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "4"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a.itemsize"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<memory at 0x0000020830C7E7E0>"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a.data"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 数组创建"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- 从序列(元组与列表)创建，自动由序列元素类型推断数组元素类型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([2, 3, 4, 5])"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a=np.array([2,3,4,5])\n",
    "a"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[1, 2, 3],\n",
       "       [4, 5, 6]])"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "b=np.array([[1,2,3],[4,5,6]])\n",
    "b"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[3, 7, 4],\n",
       "       [2, 5, 9]])"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "c=np.array([(3,7,4),(2,5,9)])\n",
    "c"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[2, 7, 3],\n",
       "       [3, 8, 4]])"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "d=np.array(([2,7,3],[3,8,4]))\n",
    "d"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[7, 2, 5],\n",
       "       [4, 1, 0]])"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "e=np.array([(7,2,5),[4,1,0]])\n",
    "e"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "可知，使用序列方式生成数组不在乎使用的是列表型还是元组型序列，甚至可以混用，但是最外面最好还是使用中括号，以免和`array`函数的括号搞混  \n",
    "数组元素类型也可在生成的时候指定:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[1.+0.j, 2.+0.j, 3.+0.j, 4.+0.j, 5.+0.j],\n",
       "       [6.+0.j, 7.+0.j, 8.+0.j, 9.+0.j, 0.+0.j]])"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "f=np.array([[1,2,3,4,5],[6,7,8,9,0]],dtype=complex)\n",
    "f"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- 生成特殊数组（类似matlab生成特殊矩阵）"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[0., 0., 0., 0.],\n",
       "       [0., 0., 0., 0.],\n",
       "       [0., 0., 0., 0.]])"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a=np.zeros([3,4])#生成全为0数组\n",
    "a"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[1., 1., 1., 1., 1.],\n",
       "       [1., 1., 1., 1., 1.],\n",
       "       [1., 1., 1., 1., 1.],\n",
       "       [1., 1., 1., 1., 1.],\n",
       "       [1., 1., 1., 1., 1.]])"
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "b=np.ones([5,5])#生成全为1数组\n",
    "b"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[0., 0., 0., 0., 0.],\n",
       "       [0., 0., 0., 0., 0.],\n",
       "       [0., 0., 0., 0., 0.]])"
      ]
     },
     "execution_count": 25,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "c=np.empty([3,5])#生成未初始化数组,数组元素取决于内存所处的状态\n",
    "c"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[1., 0., 0., 0.],\n",
       "       [0., 1., 0., 0.],\n",
       "       [0., 0., 1., 0.],\n",
       "       [0., 0., 0., 1.]])"
      ]
     },
     "execution_count": 28,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "d=np.identity(4)#生成单位矩阵\n",
    "d"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[1., 0., 0., 0.],\n",
       "       [0., 1., 0., 0.],\n",
       "       [0., 0., 1., 0.],\n",
       "       [0., 0., 0., 1.]])"
      ]
     },
     "execution_count": 30,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "e=np.eye(4)\n",
    "e"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 1.,  2.,  3.,  4.,  5.,  6.,  7.,  8.,  9., 10.])"
      ]
     },
     "execution_count": 31,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.linspace(1,10,10)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([   1.,   10.,  100., 1000.])"
      ]
     },
     "execution_count": 32,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.logspace(0,3,4)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- 根据各轴坐标生成矩阵  \n",
    "使用`np.fromfunction(f,shape,**kwargs)`"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "metadata": {},
   "outputs": [],
   "source": [
    "def f(x,y):\n",
    "    return 10*x+y"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 0.,  1.,  2.,  3.],\n",
       "       [10., 11., 12., 13.],\n",
       "       [20., 21., 22., 23.],\n",
       "       [30., 31., 32., 33.],\n",
       "       [40., 41., 42., 43.]])"
      ]
     },
     "execution_count": 48,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.fromfunction(f,(5,4))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 数组打印"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "横向为最后一个轴，竖向为倒数第二个轴，之后每添加一个轴都是往前添加  \n",
    "最后一个轴由左向右打印  \n",
    "倒数第二个轴由上到下打印  \n",
    "其他轴由上到下打印"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[0 1 2 3 4 5]\n"
     ]
    }
   ],
   "source": [
    "a=np.arange(6)\n",
    "print(a)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[ 0  1  2  3  4]\n",
      " [ 5  6  7  8  9]\n",
      " [10 11 12 13 14]]\n"
     ]
    }
   ],
   "source": [
    "b=np.arange(15).reshape(3,5)\n",
    "print(b)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[[ 0  1  2]\n",
      "  [ 3  4  5]\n",
      "  [ 6  7  8]]\n",
      "\n",
      " [[ 9 10 11]\n",
      "  [12 13 14]\n",
      "  [15 16 17]]\n",
      "\n",
      " [[18 19 20]\n",
      "  [21 22 23]\n",
      "  [24 25 26]]]\n"
     ]
    }
   ],
   "source": [
    "c=np.arange(27).reshape(3,3,3)\n",
    "print(c)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[   0    1    2 ... 9997 9998 9999]\n"
     ]
    }
   ],
   "source": [
    "print(np.arange(10000))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[   0    1    2 ...   97   98   99]\n",
      " [ 100  101  102 ...  197  198  199]\n",
      " [ 200  201  202 ...  297  298  299]\n",
      " ...\n",
      " [9700 9701 9702 ... 9797 9798 9799]\n",
      " [9800 9801 9802 ... 9897 9898 9899]\n",
      " [9900 9901 9902 ... 9997 9998 9999]]\n"
     ]
    }
   ],
   "source": [
    "print(np.arange(10000).reshape(100,100))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "关闭以上自动省略功能可以使用`np.set_printoptions(threshold=np.nan)`语句"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 基本运算"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- 数组基本运算时按位运算"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0, 1, 2, 3])"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a=np.array([20,30,40,50])\n",
    "b=np.arange(4)\n",
    "b"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([20, 29, 38, 47])"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a-b"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0, 1, 4, 9], dtype=int32)"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "b**2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 9.12945251, -9.88031624,  7.4511316 , -2.62374854])"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "10*np.sin(a)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- `*`运算也是按位运算,矩阵乘法使用`@`运算符"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[2, 0],\n",
       "       [0, 4]])"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "A=np.array([(1,1),(0,1)])\n",
    "B=np.array([(2,0),(3,4)])\n",
    "A*B#按位乘法"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[5, 4],\n",
       "       [3, 4]])"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "A@B#矩阵乘法"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[5, 4],\n",
       "       [3, 4]])"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "A.dot(B)#矩阵乘法"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- 增强赋值运算符"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "A+=B"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[3, 1],\n",
       "       [3, 5]])"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "A"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "A+=3"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[6, 4],\n",
       "       [6, 8]])"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "A"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [],
   "source": [
    "B**=2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 4,  0],\n",
       "       [ 9, 16]])"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "B"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "按位运算时会自动向上转型，比如两个矩阵相加，结果元素的类型是两个相加数组的元素类型中更\"泛\"的那个类型"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- 针对数组的单目运算符"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "24"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "A.sum()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "8"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "A.max()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "4"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "A.min()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "上述运算可以指定沿某个轴方向执行，比如沿二维数组的第一个轴求和就是按列求和"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[6, 4],\n",
       "       [6, 8]])"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "A"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([12, 12])"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "A.sum(axis=0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([10, 14])"
      ]
     },
     "execution_count": 24,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "A.sum(axis=1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 0,  1,  2,  3],\n",
       "       [ 4,  5,  6,  7],\n",
       "       [ 8,  9, 10, 11]])"
      ]
     },
     "execution_count": 25,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a=np.arange(12).reshape(3,4)\n",
    "a"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 3,  7, 11])"
      ]
     },
     "execution_count": 26,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a.max(axis=1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 0,  1,  2,  3],\n",
       "       [ 4,  6,  8, 10],\n",
       "       [12, 15, 18, 21]], dtype=int32)"
      ]
     },
     "execution_count": 27,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a.cumsum(axis=0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 0,  1,  3,  6, 10, 15, 21, 28, 36, 45, 55, 66], dtype=int32)"
      ]
     },
     "execution_count": 28,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a.cumsum()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 通用函数"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "numpy提供`sin`,`cos`,`tan`等数学函数，对数组按位进行相应运算，称之为通用函数\"universal function\"(`ufunc`)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0, 1, 2])"
      ]
     },
     "execution_count": 29,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a=np.arange(3)\n",
    "a"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([1.        , 2.71828183, 7.3890561 ])"
      ]
     },
     "execution_count": 30,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.exp(a)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0.        , 0.84147098, 0.90929743])"
      ]
     },
     "execution_count": 31,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.sin(a)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0.        , 1.        , 1.41421356])"
      ]
     },
     "execution_count": 32,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.sqrt(a)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0, 2, 6])"
      ]
     },
     "execution_count": 34,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.add(a,np.power(a,2))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 索引、切片与迭代"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- 一维数组与普通列表一样索引、切片与迭代"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "metadata": {},
   "outputs": [],
   "source": [
    "a=np.arange(12)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "3"
      ]
     },
     "execution_count": 50,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a[3]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([3, 4, 5, 6, 7, 8, 9])"
      ]
     },
     "execution_count": 51,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a[3:10]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([11, 10,  9,  8,  7,  6,  5,  4,  3,  2,  1,  0])"
      ]
     },
     "execution_count": 52,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a[::-1]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 1,  4,  7, 10])"
      ]
     },
     "execution_count": 53,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a[1::3]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- 多维数组用多个索引，各个索引用逗号隔开，每个索引方式与一维数组是一样的"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 55,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 0.,  2.,  4.,  6.],\n",
       "       [ 1.,  3.,  5.,  7.],\n",
       "       [ 4.,  6.,  8., 10.],\n",
       "       [ 9., 11., 13., 15.],\n",
       "       [16., 18., 20., 22.]])"
      ]
     },
     "execution_count": 55,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "b=np.fromfunction(lambda x,y:x**2+2*y,(5,4))\n",
    "b"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 56,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "10.0"
      ]
     },
     "execution_count": 56,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "b[2,3]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 57,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 3.,  5.],\n",
       "       [ 6.,  8.],\n",
       "       [11., 13.],\n",
       "       [18., 20.]])"
      ]
     },
     "execution_count": 57,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "b[1:5,[1,2]]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 58,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[22., 18.],\n",
       "       [15., 11.],\n",
       "       [10.,  6.],\n",
       "       [ 7.,  3.],\n",
       "       [ 6.,  2.]])"
      ]
     },
     "execution_count": 58,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "b[::-1,[3,1]]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 59,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 9., 11., 13., 15.])"
      ]
     },
     "execution_count": 59,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "b[3]#第3行整行,缺失的索引自动补全为:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 60,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 4.,  5.,  8., 13., 20.])"
      ]
     },
     "execution_count": 60,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "b[:,2]#第2列整列"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 61,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 4.,  5.,  8., 13., 20.])"
      ]
     },
     "execution_count": 61,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "b[...,2]#...可以代表其他的轴全部用:索引,高阶的数组可以使用这种方式索引，指定首尾的索引，中间的可略"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 65,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[0. 2. 4. 6.]\n",
      "[1. 3. 5. 7.]\n",
      "[ 4.  6.  8. 10.]\n",
      "[ 9. 11. 13. 15.]\n",
      "[16. 18. 20. 22.]\n"
     ]
    }
   ],
   "source": [
    "for row in b:#按第一个轴迭代\n",
    "    print(row)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 66,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.0\n",
      "2.0\n",
      "4.0\n",
      "6.0\n",
      "1.0\n",
      "3.0\n",
      "5.0\n",
      "7.0\n",
      "4.0\n",
      "6.0\n",
      "8.0\n",
      "10.0\n",
      "9.0\n",
      "11.0\n",
      "13.0\n",
      "15.0\n",
      "16.0\n",
      "18.0\n",
      "20.0\n",
      "22.0\n"
     ]
    }
   ],
   "source": [
    "for all_ele in b.flat:#展开迭代\n",
    "    print(all_ele)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 变形"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "numpy中的ndarray有`shape`属性表示数组的形状（即沿每一个轴的元素个数），可使用以下几种方式生成改变形状的数组:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[6., 8., 8., 8.],\n",
       "       [9., 6., 1., 1.],\n",
       "       [0., 0., 4., 6.]])"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a=np.floor(10*np.random.random([3,4]))\n",
    "a"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([6., 8., 8., 8., 9., 6., 1., 1., 0., 0., 4., 6.])"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a.ravel()#展开"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "> 展开是是使用C-Style，即后面的索引变化最快,a[0,0]之后是a[0,1]。numpy中横向(行)是最后一个轴方向,纵向(列)是倒数第二个轴方向,之后每添加一个轴都是往前面添加,比如四维数组a,a[2,1,5,3]中,5是倒数第二个轴方向索引,也即行号;3是最后一个轴索引,也即列号"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[6., 8., 8.],\n",
       "       [8., 9., 6.],\n",
       "       [1., 1., 0.],\n",
       "       [0., 4., 6.]])"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a.reshape(4,3)#变形"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[6., 9., 0.],\n",
       "       [8., 6., 0.],\n",
       "       [8., 1., 4.],\n",
       "       [8., 1., 6.]])"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a.T#转置"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[6., 8., 8., 8., 9., 6.],\n",
       "       [1., 1., 0., 0., 4., 6.]])"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a.resize(2,6)#原位变形\n",
    "a"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[6., 8., 8., 8.],\n",
       "       [9., 6., 1., 1.],\n",
       "       [0., 0., 4., 6.]])"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a.reshape(3,-1)#-1表示自动推测沿第二轴元素个数"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 数组堆叠拼接"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "a=\n",
      "[[8. 6. 4.]\n",
      " [0. 6. 5.]\n",
      " [6. 7. 9.]]\n",
      "b=\n",
      "[[9. 2. 2.]\n",
      " [3. 2. 5.]\n",
      " [9. 9. 1.]]\n"
     ]
    }
   ],
   "source": [
    "a=np.floor(10*np.random.random([3,3]))\n",
    "print('a=')\n",
    "print(a)\n",
    "b=np.floor(10*np.random.random([3,3]))\n",
    "print('b=')\n",
    "print(b)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- `hstack`与`vsatck`函数分别进行水平堆叠与垂直堆叠  \n",
    "- `column_stack`与`row_stack`分别进行当做列堆叠与当做行堆叠，对二维数组堆叠时分别与`hstack`，`vstack`功能相同"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[8., 6., 4., 9., 2., 2.],\n",
       "       [0., 6., 5., 3., 2., 5.],\n",
       "       [6., 7., 9., 9., 9., 1.]])"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.hstack([a,b])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[8., 6., 4.],\n",
       "       [0., 6., 5.],\n",
       "       [6., 7., 9.],\n",
       "       [9., 2., 2.],\n",
       "       [3., 2., 5.],\n",
       "       [9., 9., 1.]])"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.vstack((a,b))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[8., 6., 4., 9., 2., 2.],\n",
       "       [0., 6., 5., 3., 2., 5.],\n",
       "       [6., 7., 9., 9., 9., 1.]])"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.column_stack([a,b])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[8., 6., 4.],\n",
       "       [0., 6., 5.],\n",
       "       [6., 7., 9.],\n",
       "       [9., 2., 2.],\n",
       "       [3., 2., 5.],\n",
       "       [9., 9., 1.]])"
      ]
     },
     "execution_count": 28,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.row_stack([a,b])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "一维数组堆叠时使用`column_stack`与`hstack`效果不一样，因为`column_stack`将一维数组当成列向量横向堆叠,但是`hstack`将一维数组当做行向量堆叠"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [],
   "source": [
    "c=np.arange(3)\n",
    "d=np.arange(3,6)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[0, 3],\n",
       "       [1, 4],\n",
       "       [2, 5]])"
      ]
     },
     "execution_count": 24,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.column_stack([c,d])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0, 1, 2, 3, 4, 5])"
      ]
     },
     "execution_count": 25,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.hstack([c,d])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[0, 1, 2],\n",
       "       [3, 4, 5]])"
      ]
     },
     "execution_count": 26,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.row_stack([c,d])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[0, 1, 2],\n",
       "       [3, 4, 5]])"
      ]
     },
     "execution_count": 27,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.vstack([c,d])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "加入一个新的第二个轴则可以把一维数组变成二维数组，这时候用`hstack`效果与`column_stack`一样了"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[0],\n",
       "       [1],\n",
       "       [2]])"
      ]
     },
     "execution_count": 32,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from numpy import newaxis\n",
    "c[:,newaxis]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[0, 3],\n",
       "       [1, 4],\n",
       "       [2, 5]])"
      ]
     },
     "execution_count": 34,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.hstack([c[:,newaxis],d[:,newaxis]])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(3, 1)"
      ]
     },
     "execution_count": 35,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "c[:,newaxis].shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[0, 1, 2]])"
      ]
     },
     "execution_count": 41,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "c[newaxis,:]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(1, 3)"
      ]
     },
     "execution_count": 42,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "c[newaxis,:].shape"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "`concatenate`函数可以直接指定沿哪个轴进行堆叠"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[8., 6., 4., 9., 2., 2.],\n",
       "       [0., 6., 5., 3., 2., 5.],\n",
       "       [6., 7., 9., 9., 9., 1.]])"
      ]
     },
     "execution_count": 39,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.concatenate([a,b],axis=1)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "`r_`与`c_`函数可以直接生成水平、垂直堆叠而成的数组，不一样的是，函数里可以使用`:`字符快速生成范围数组"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 0,  1,  2,  3,  9, 16])"
      ]
     },
     "execution_count": 36,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.r_[0:4,9,16]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[2, 3, 4],\n",
       "       [3, 4, 5],\n",
       "       [4, 5, 6]])"
      ]
     },
     "execution_count": 38,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.c_[2:5,3:6,4:7]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 数组分割"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "类似数组堆叠，数组可以水平、垂直分割"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[6., 9., 4., 9., 5., 0., 3., 1., 1., 9., 6., 9.],\n",
       "       [5., 9., 1., 9., 9., 1., 9., 3., 1., 8., 7., 0.]])"
      ]
     },
     "execution_count": 43,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a=np.floor(10*np.random.random([2,12]))\n",
    "a"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[array([[6., 9., 4., 9.],\n",
       "        [5., 9., 1., 9.]]), array([[5., 0., 3., 1.],\n",
       "        [9., 1., 9., 3.]]), array([[1., 9., 6., 9.],\n",
       "        [1., 8., 7., 0.]])]"
      ]
     },
     "execution_count": 44,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.hsplit(a,3)#均分"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[array([[6., 9., 4., 9., 5.],\n",
       "        [5., 9., 1., 9., 9.]]), array([[0., 3.],\n",
       "        [1., 9.]]), array([[1., 1., 9., 6., 9.],\n",
       "        [3., 1., 8., 7., 0.]])]"
      ]
     },
     "execution_count": 45,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.hsplit(a,[5,7])#给出元组按列号分"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[3., 4., 3.],\n",
       "       [4., 6., 9.],\n",
       "       [5., 1., 6.],\n",
       "       [5., 1., 7.],\n",
       "       [5., 9., 5.],\n",
       "       [7., 7., 1.],\n",
       "       [2., 5., 7.],\n",
       "       [9., 1., 5.]])"
      ]
     },
     "execution_count": 46,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "b=np.floor(10*np.random.random([8,3]))\n",
    "b"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[array([[3., 4., 3.],\n",
       "        [4., 6., 9.],\n",
       "        [5., 1., 6.],\n",
       "        [5., 1., 7.]]), array([[5., 9., 5.],\n",
       "        [7., 7., 1.],\n",
       "        [2., 5., 7.],\n",
       "        [9., 1., 5.]])]"
      ]
     },
     "execution_count": 48,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.vsplit(b,2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[array([[3., 4., 3.],\n",
       "        [4., 6., 9.]]),\n",
       " array([[5., 1., 6.]]),\n",
       " array([[5., 1., 7.]]),\n",
       " array([[5., 9., 5.],\n",
       "        [7., 7., 1.],\n",
       "        [2., 5., 7.],\n",
       "        [9., 1., 5.]])]"
      ]
     },
     "execution_count": 49,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.vsplit(b,[2,3,4])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "`array_split`可以指定沿哪个轴分割"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[array([[6., 9., 4., 9., 5., 0.],\n",
       "        [5., 9., 1., 9., 9., 1.]]), array([[3., 1., 1., 9., 6., 9.],\n",
       "        [9., 3., 1., 8., 7., 0.]])]"
      ]
     },
     "execution_count": 52,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.array_split(a,2,axis=1)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 拷贝与视图"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- 无拷贝——简单赋值号无拷贝，即是同一个对象，引用传递"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 56,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 0,  1,  2,  3],\n",
       "       [ 4,  5,  6,  7],\n",
       "       [ 8,  9, 10, 11]])"
      ]
     },
     "execution_count": 56,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a=np.arange(12).reshape([3,4])\n",
    "a"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 57,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "True"
      ]
     },
     "execution_count": 57,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "b=a\n",
    "b is a"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 58,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(4, 3)"
      ]
     },
     "execution_count": 58,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "b.shape=4,3\n",
    "a.shape"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- 视图与浅拷贝——切片所得的是浅拷贝视图（即视图可以不一样，但是数据是一样的）"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 59,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "False"
      ]
     },
     "execution_count": 59,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "c=a.view()\n",
    "c is a"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 72,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "True"
      ]
     },
     "execution_count": 72,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "c.base is a.base"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 75,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(4, 3)"
      ]
     },
     "execution_count": 75,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "c.shape=2,6\n",
    "a.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 76,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[   0,    1,    2],\n",
       "       [   3, 1234,    5],\n",
       "       [   6,    7,    8],\n",
       "       [   9,   10,   11]])"
      ]
     },
     "execution_count": 76,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "c[0,4]=1234\n",
    "a"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 77,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 0, 10, 10],\n",
       "       [ 3, 10, 10],\n",
       "       [ 6, 10, 10],\n",
       "       [ 9, 10, 10]])"
      ]
     },
     "execution_count": 77,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "s=a[:,1:3]\n",
    "s[:]=10\n",
    "a"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- 深拷贝"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 78,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "False"
      ]
     },
     "execution_count": 78,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "c=a.copy()\n",
    "c is a"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 79,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "False"
      ]
     },
     "execution_count": 79,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "c.base is a.base"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 80,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[9999,   10,   10],\n",
       "       [   3,   10,   10],\n",
       "       [   6,   10,   10],\n",
       "       [   9,   10,   10]])"
      ]
     },
     "execution_count": 80,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "c[0,0]=9999\n",
    "c"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 81,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 0, 10, 10],\n",
       "       [ 3, 10, 10],\n",
       "       [ 6, 10, 10],\n",
       "       [ 9, 10, 10]])"
      ]
     },
     "execution_count": 81,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 函数与方法一览"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "函数与方法一览，参见<a href=\"https://docs.scipy.org/doc/numpy/user/quickstart.html#functions-and-methods-overview\" target=\"_blank\">官网tutorial</a>  \n",
    "- 数组创建:  \n",
    "`arange`,`array`,`copy`,`empty`,`empty_like`,`eye`,`fromfile`,`fromfunction`,`identity`,  \n",
    "`linspace`,`logspace`,`mgrid`,`ogrid`,`ones`,`ones_like`,`r`,`zeros`,`zeros_like`\n",
    "- 数组转换  \n",
    "`ndarray.astype`,`atleast_1d`,`atleast_2d`,`atleast_3d`,`mat`\n",
    "- 数组操作  \n",
    "`array_split`,`column_stack`,`concatenate`,`diagonal`,`dsplit`,`dstack`,`hsplit`,`hstack`,   \n",
    "`ndarray.item`,`newaxis`,`ravel`,`repeat`,`reshape`,`resize`,`squeeze`,`swapaxes`,`take`,`transpose`,`vsplit`,`vstack`\n",
    "- 问题  \n",
    "`all`, `any`, `nonzero`, `where`\n",
    "- 排序  \n",
    "`argmax`, `argmin`, `argsort`, `max`, `min`, `ptp`, `searchsorted`, `sort`\n",
    "- 运算  \n",
    "`choose`, `compress`, `cumprod`, `cumsum`, `inner`, `ndarray.fill`, `imag`, `prod`, `put`, `putmask`, `real`, `sum`\n",
    "- 基本统计  \n",
    "`cov`, `mean`, `std`, `var`\n",
    "- 基本线性代数  \n",
    "`cross`, `dot`, `outer`, `linalg.svd`, `vdot`"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Numpy进阶"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 广播法则"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "针对不同维，不同尺寸的数组之间进行按位运算会自动执行广播法则，广播法则如下：  \n",
    "- 低阶数组与高阶数组按位运算时会自动升维成为同阶数组，增加的维度尺寸自动设为1\n",
    "- 某个维度上尺寸为1的数组与该维度上尺度不为1的数组按位运算时会自动上升到同一尺寸，沿该维度增加的元素与第一个元素相同"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 90,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[ 0  1  2  3]\n",
      " [ 4  5  6  7]\n",
      " [ 8  9 10 11]]\n",
      "\n",
      "[0 1 2 3]\n",
      "\n",
      "[[1]\n",
      " [2]\n",
      " [3]]\n"
     ]
    }
   ],
   "source": [
    "from numpy import newaxis\n",
    "a=np.arange(12).reshape(3,4)\n",
    "b=np.arange(4)\n",
    "c=np.arange(1,4)[:,newaxis]\n",
    "print(a)\n",
    "print()\n",
    "print(b)\n",
    "print()\n",
    "print(c)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 88,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 0,  2,  4,  6],\n",
       "       [ 4,  6,  8, 10],\n",
       "       [ 8, 10, 12, 14]])"
      ]
     },
     "execution_count": 88,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a+b"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "`a`与`b`不同阶(`b`是一阶数组,`a`是二阶数组),`b`自动升维成2阶数组,但是在第二个轴上与`a`尺寸不同,故自动增加相同的元素,最后成为  \n",
    "array([[0,1,2,3],[0,1,2,3],[0,1,2,3]])  \n",
    "然后`a+b`成为同阶同尺寸的按位运算"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 91,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[   0,    1,    2,    3],\n",
       "       [  16,   25,   36,   49],\n",
       "       [ 512,  729, 1000, 1331]], dtype=int32)"
      ]
     },
     "execution_count": 91,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a**c"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 93,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[0, 1, 2, 3],\n",
       "       [0, 2, 4, 6],\n",
       "       [0, 3, 6, 9]])"
      ]
     },
     "execution_count": 93,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "b*c"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 94,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[2],\n",
       "       [3],\n",
       "       [4]])"
      ]
     },
     "execution_count": 94,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "c+1"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 高级索引技巧"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 数组索引"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "数组索引即为用数组做索引。对高维数组进行索引，每个维度都要使用一个数组，且因为作为索引的数组决定切片的shape，所以所有的数组必须形状(shape)相同"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 96,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 0,  1,  2,  3,  4],\n",
       "       [ 5,  6,  7,  8,  9],\n",
       "       [10, 11, 12, 13, 14],\n",
       "       [15, 16, 17, 18, 19]])"
      ]
     },
     "execution_count": 96,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a=np.arange(20).reshape(4,5)\n",
    "a"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 97,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0, 1, 2, 3, 4, 5, 6, 7])"
      ]
     },
     "execution_count": 97,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "b=np.arange(8)\n",
    "b"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 98,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([2, 3, 2, 5, 0, 1])"
      ]
     },
     "execution_count": 98,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "c=np.array([2,3,2,5,0,1])\n",
    "b[c]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 102,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 8, 10],\n",
       "       [ 7, 11]])"
      ]
     },
     "execution_count": 102,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "d=np.array([[1,2],[1,2]])#d,e必须shape相同，因为他们的shape决定返回数组的shape；d,e分别决定第一维与第二维的索引\n",
    "e=np.array([[3,0],[2,1]])\n",
    "a[d,e]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "也可以使用一个序列把d,e装起来然后对a索引；但是注意不能把d,e装起来变成数组(array)对a索引，因为数组对a索引会把该数组作为第一个维度的索引"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 107,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 8, 10],\n",
       "       [ 7, 11]])"
      ]
     },
     "execution_count": 107,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "l=d,e\n",
    "a[l]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 111,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[[[ 5,  6,  7,  8,  9],\n",
       "         [10, 11, 12, 13, 14]],\n",
       "\n",
       "        [[ 5,  6,  7,  8,  9],\n",
       "         [10, 11, 12, 13, 14]]],\n",
       "\n",
       "\n",
       "       [[[15, 16, 17, 18, 19],\n",
       "         [ 0,  1,  2,  3,  4]],\n",
       "\n",
       "        [[10, 11, 12, 13, 14],\n",
       "         [ 5,  6,  7,  8,  9]]]])"
      ]
     },
     "execution_count": 111,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "l=np.array([d,e])\n",
    "a[l]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "当然可以像以下使用两个序列来进行切片，但这样相对来说受限——结果数组中同一行必定来自源数组同一行，同一列必定来自源数组同一列——相对来说，数组索引可以不受此限制，比如要生成一个2\\*2数组，比如上面的`a[d,e]`，就无法使用序列索引切片达到"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 108,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 6,  7,  8,  9],\n",
       "       [16, 17, 18, 19],\n",
       "       [11, 12, 13, 14]])"
      ]
     },
     "execution_count": 108,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a[[1,3,2],1:]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "数组索引切片作为左值(与普通切片一样，只是一个视图，是浅拷贝)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 0,  1,  2,  3],\n",
       "       [ 4,  5,  6,  7],\n",
       "       [ 8,  9, 10, 11]])"
      ]
     },
     "execution_count": 1,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import numpy as np\n",
    "a=np.arange(12).reshape(3,4)\n",
    "a"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 0,  1,  2,  3],\n",
       "       [ 0,  0,  0,  0],\n",
       "       [ 8,  9, 10, 11]])"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a[1]=0\n",
    "a"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 0, 99, 99,  3],\n",
       "       [ 0,  0,  0,  0],\n",
       "       [ 8, 99, 99, 11]])"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "ix=np.array([[0,2],[0,2]])\n",
    "iy=np.array([[1,1],[2,2]])\n",
    "a[ix,iy]=99\n",
    "a"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 布尔值索引"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "布尔值索引有两种方式，  \n",
    "- 一种是给出一个与源数组同形状的逻辑数组，指定每一个元素是否需要\n",
    "- 一种是对每一个维度给出一个逻辑数组，会自动转换成对应的数组索引进行索引"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[2., 8., 4., 5., 7.],\n",
       "       [6., 0., 7., 0., 9.],\n",
       "       [2., 1., 5., 9., 5.],\n",
       "       [8., 5., 2., 9., 4.]])"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a=np.floor(10*np.random.random([4,5]))\n",
    "a"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[False,  True, False,  True,  True],\n",
       "       [ True, False,  True, False,  True],\n",
       "       [False, False,  True,  True,  True],\n",
       "       [ True,  True, False,  True, False]])"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "b=a>=5\n",
    "b"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([8., 5., 7., 6., 7., 9., 5., 9., 5., 8., 5., 9.])"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a[b]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ True, False,  True, False])"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "c=np.arange(a.shape[0])%2==0\n",
    "c"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ True, False,  True, False, False])"
      ]
     },
     "execution_count": 51,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "d=np.arange(a.shape[1])\n",
    "d=(d==0)|(d==2)\n",
    "d"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "> 要注意运算符的优先级,`==`比位运算符要低,参考[Python运算符优先级](http://www.runoob.com/python/python-operators.html#ysf8)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[2., 8., 4., 5., 7.],\n",
       "       [2., 1., 5., 9., 5.]])"
      ]
     },
     "execution_count": 52,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a[c]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[2., 4.],\n",
       "       [6., 7.],\n",
       "       [2., 5.],\n",
       "       [8., 2.]])"
      ]
     },
     "execution_count": 53,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a[:,d]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 56,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([2., 5.])"
      ]
     },
     "execution_count": 56,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a[c,d]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "> 这里比较奇怪，按照我原来的意思，应当是取出偶数行，0、2列交叉处的元素,但事实出乎意料。就我的理解，\n",
    "> - 布尔值作索引其实是转化成对应的数组索引，只是把True对应位置的索引保留组成数组来索引,所以`a[c]`等价于`a[[0,2]]`\n",
    "> - 而各个维度都是索引时可能会自动转型成各个维度都是ndarray，由上面可知,各个维度给出数组索引时,每个索引必须shape相同,且其shape就是最后结果的shape。所以上述`a[c,d]`其实等价于`a[[0,2],[0,2]]`,而两个维度上的序列`[0,2]`索引又被转型成两个`array([0,2])`,成了`a[array([0,2]),array([0,2])]`,最后索引的结果是一个shape为(2,)的数组,两个元素分别为`a[0,0]`与`a[2,2]`。假设改为`a[[0,2],[0,2,4]]`则不可以，因为序列转化成ndarray后不是合法的数组索引(两个索引shape不合)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 57,
   "metadata": {},
   "outputs": [
    {
     "ename": "IndexError",
     "evalue": "shape mismatch: indexing arrays could not be broadcast together with shapes (2,) (3,) ",
     "output_type": "error",
     "traceback": [
      "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[1;31mIndexError\u001b[0m                                Traceback (most recent call last)",
      "\u001b[1;32m<ipython-input-57-9582139dcec8>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m()\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[0ma\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;32mTrue\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;32mFalse\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;32mTrue\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;32mFalse\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;32mTrue\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;32mFalse\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;32mTrue\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;32mFalse\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;32mTrue\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m",
      "\u001b[1;31mIndexError\u001b[0m: shape mismatch: indexing arrays could not be broadcast together with shapes (2,) (3,) "
     ]
    }
   ],
   "source": [
    "a[[True,False,True,False],[True,False,True,False,True]]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "而如果要取某几行某几列应该怎么做？相对于matlab中一步到位，python中需要两步才行,比如上述要取a的1,3行,1,3列子集如上`a[c,d]`是错误的,正确的应该如下:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 75,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[2., 4.],\n",
       "       [2., 5.]])"
      ]
     },
     "execution_count": 75,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a[c][:,d]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## numpy.ix_()函数"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "numpy中的`ix_()`函数充分利用了广播的特性,用于生成坐标网格。我们知道在matlab中将两个向量生成网格可以用`meshgrid`函数，比如:\n",
    "```matlab\n",
    ">>>x=1:5\n",
    "x=\n",
    "    1  2  3  4  5\n",
    ">>>y=6:10\n",
    "y=\n",
    "    6  7  8  9  10\n",
    ">>>[X,Y]=meshgrid(x,y)\n",
    "X=\n",
    "    1  2  3  4  5\n",
    "    1  2  3  4  5\n",
    "    1  2  3  4  5\n",
    "    1  2  3  4  5\n",
    "    1  2  3  4  5\n",
    "Y=\n",
    "    6  6  6  6  6\n",
    "    7  7  7  7  7\n",
    "    8  8  8  8  8\n",
    "    9  9  9  9  9\n",
    "    10 10 10 10 10\n",
    ">>>Z=X.*Y\n",
    "Z=\n",
    "    6  12 18 24 30\n",
    "    7  14 21 28 35\n",
    "    8  16 24 32 40\n",
    "    9  18 27 36 45\n",
    "    10 20 30 40 50\n",
    "```  \n",
    "但是这样生成的X,Y矩阵有大量的冗余数据,numpy的`ix_()`函数则不是；`ix_()`函数返回向量，但是是在不同维度上的向量，这样进行按位运算时会利用到广播的特性，起到与网格同样的效果,且不增加数据量:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 96,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(array([[1],\n",
       "        [2],\n",
       "        [3],\n",
       "        [4],\n",
       "        [5]]), array([[ 6,  7,  8,  9, 10]]))"
      ]
     },
     "execution_count": 96,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a=np.arange(1,6)\n",
    "b=np.arange(6,11)\n",
    "ax,bx=np.ix_(a,b)\n",
    "ax,bx"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 97,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "((5, 1), (1, 5))"
      ]
     },
     "execution_count": 97,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "ax.shape,bx.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 98,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 6,  7,  8,  9, 10],\n",
       "       [12, 14, 16, 18, 20],\n",
       "       [18, 21, 24, 27, 30],\n",
       "       [24, 28, 32, 36, 40],\n",
       "       [30, 35, 40, 45, 50]])"
      ]
     },
     "execution_count": 98,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "c=ax*bx\n",
    "c"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 99,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "27"
      ]
     },
     "execution_count": 99,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "c[2,3]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 100,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "27"
      ]
     },
     "execution_count": 100,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a[2]*b[3]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "numpy中还有`ogrid`与`mgrid`方法生成坐标网格，差别是`ogrid`和`ix_()`函数一样，生成不同维度上的向量，而`mgrid`像matlab一样生成密集网格;`ogrid`与`mgrid`可以使用范围数组类似的生成方法:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 109,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([-1. , -0.5,  0. ,  0.5])"
      ]
     },
     "execution_count": 109,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.ogrid[-1:1:0.5]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 110,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([-1. , -0.5,  0. ,  0.5])"
      ]
     },
     "execution_count": 110,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.mgrid[-1:1:0.5]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 114,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(array([[0. ],\n",
       "        [0.5],\n",
       "        [1. ],\n",
       "        [1.5],\n",
       "        [2. ],\n",
       "        [2.5]]), array([[4. , 4.5, 5. , 5.5, 6. , 6.5]]))"
      ]
     },
     "execution_count": 114,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "ao,bo=np.ogrid[0:3:0.5,4:7:0.5]\n",
    "ao,bo"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 115,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "((6, 1), (1, 6))"
      ]
     },
     "execution_count": 115,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "ao.shape,bo.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 116,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(array([[0. , 0. , 0. , 0. , 0. , 0. ],\n",
       "        [0.5, 0.5, 0.5, 0.5, 0.5, 0.5],\n",
       "        [1. , 1. , 1. , 1. , 1. , 1. ],\n",
       "        [1.5, 1.5, 1.5, 1.5, 1.5, 1.5],\n",
       "        [2. , 2. , 2. , 2. , 2. , 2. ],\n",
       "        [2.5, 2.5, 2.5, 2.5, 2.5, 2.5]]),\n",
       " array([[4. , 4.5, 5. , 5.5, 6. , 6.5],\n",
       "        [4. , 4.5, 5. , 5.5, 6. , 6.5],\n",
       "        [4. , 4.5, 5. , 5.5, 6. , 6.5],\n",
       "        [4. , 4.5, 5. , 5.5, 6. , 6.5],\n",
       "        [4. , 4.5, 5. , 5.5, 6. , 6.5],\n",
       "        [4. , 4.5, 5. , 5.5, 6. , 6.5]]))"
      ]
     },
     "execution_count": 116,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "am,bm=np.mgrid[0:3:0.5,4:7:0.5]\n",
    "am,bm"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 117,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "((6, 6), (6, 6))"
      ]
     },
     "execution_count": 117,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "am.shape,bm.shape"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "如果第二个`:`后是实数，则表示步进值，且不包括终止值(与范围数组生成方法一样)；如果第二个`:`后是虚数，则表示生成数的个数，包括终止值(与`np.linspace`函数一致):"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 120,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(array([[0.],\n",
       "        [1.],\n",
       "        [2.],\n",
       "        [3.],\n",
       "        [4.]]), array([[ 6.,  7.,  8.,  9., 10.]]))"
      ]
     },
     "execution_count": 120,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "ao,bo=np.ogrid[0:4:5j,6:10:5j]\n",
    "ao,bo"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 122,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(array([[0., 0., 0., 0., 0.],\n",
       "        [1., 1., 1., 1., 1.],\n",
       "        [2., 2., 2., 2., 2.],\n",
       "        [3., 3., 3., 3., 3.],\n",
       "        [4., 4., 4., 4., 4.]]), array([[ 6.,  7.,  8.,  9., 10.],\n",
       "        [ 6.,  7.,  8.,  9., 10.],\n",
       "        [ 6.,  7.,  8.,  9., 10.],\n",
       "        [ 6.,  7.,  8.,  9., 10.],\n",
       "        [ 6.,  7.,  8.,  9., 10.]]))"
      ]
     },
     "execution_count": 122,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "am,bm=np.mgrid[0:4:5j,6:10:5j]\n",
    "am,bm"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 线性代数"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 基本操作"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 123,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[1. 2.]\n",
      " [3. 4.]]\n"
     ]
    }
   ],
   "source": [
    "a=np.array([[1.0,2.0],[3.0,4.0]])\n",
    "print(a)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- 转置"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 142,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[1., 3.],\n",
       "       [2., 4.]])"
      ]
     },
     "execution_count": 142,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a.transpose()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- 求逆"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 129,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[-2. ,  1. ],\n",
       "       [ 1.5, -0.5]])"
      ]
     },
     "execution_count": 129,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "b=np.linalg.inv(a)\n",
    "b"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- 矩阵乘法"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 143,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(array([[1.00000000e+00, 1.11022302e-16],\n",
       "        [0.00000000e+00, 1.00000000e+00]]),\n",
       " array([[1.0000000e+00, 4.4408921e-16],\n",
       "        [0.0000000e+00, 1.0000000e+00]]))"
      ]
     },
     "execution_count": 143,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a@b,b@a"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- 求迹"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 131,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[1., 0., 0., 0., 0.],\n",
       "       [0., 1., 0., 0., 0.],\n",
       "       [0., 0., 1., 0., 0.],\n",
       "       [0., 0., 0., 1., 0.],\n",
       "       [0., 0., 0., 0., 1.]])"
      ]
     },
     "execution_count": 131,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "u=np.eye(5)#单位矩阵\n",
    "u"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 134,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "5.0"
      ]
     },
     "execution_count": 134,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.trace(u)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- 求解线性方程组"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 135,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[5],\n",
       "       [7]])"
      ]
     },
     "execution_count": 135,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y=np.array([5,7])[:,newaxis]\n",
    "y"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 137,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[-3.],\n",
       "       [ 4.]])"
      ]
     },
     "execution_count": 137,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x=np.linalg.solve(a,y)#求线性方程组\n",
    "x"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 140,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ True],\n",
       "       [ True]])"
      ]
     },
     "execution_count": 140,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a@x==y"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- 求特征值、特征向量"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 145,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(array([ 6.77881035,  1.81790737, -2.59671773]),\n",
       " array([[ 0.49974338,  0.85870632,  0.1134901 ],\n",
       "        [ 0.66932902, -0.29967981, -0.67984607],\n",
       "        [ 0.54977742, -0.41571079,  0.72452006]]))"
      ]
     },
     "execution_count": 145,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "j=np.array([[3.0,2.0,1.0],[2.0,2.0,4.0],[1.0,4.0,1.0]])\n",
    "w,v=np.linalg.eig(j)\n",
    "w,v"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 146,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 6.77881035,  0.        ,  0.        ],\n",
       "       [ 0.        ,  1.81790737,  0.        ],\n",
       "       [ 0.        ,  0.        , -2.59671773]])"
      ]
     },
     "execution_count": 146,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.diag(w)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 150,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 6.77881035e+00, -1.52280308e-15, -9.55816643e-18],\n",
       "       [-1.42546771e-15,  1.81790737e+00, -1.85604399e-16],\n",
       "       [-1.28994776e-16, -3.67237796e-16, -2.59671773e+00]])"
      ]
     },
     "execution_count": 150,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "v.T@j@v"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 技巧与建议"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- 自动重构(reshape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 151,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(2, 5, 3)"
      ]
     },
     "execution_count": 151,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a=np.arange(30)\n",
    "a.shape=2,-1,3\n",
    "a.shape"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "> -1表示自动推断大小"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- 向量堆叠"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 152,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(array([0, 1, 2, 3, 4]), array([0, 2, 4, 6, 8]))"
      ]
     },
     "execution_count": 152,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x=np.arange(5)\n",
    "y=x*2\n",
    "x,y"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 154,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[0, 1, 2, 3, 4],\n",
       "       [0, 2, 4, 6, 8]])"
      ]
     },
     "execution_count": 154,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.vstack([x,y])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 155,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0, 1, 2, 3, 4, 0, 2, 4, 6, 8])"
      ]
     },
     "execution_count": 155,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.hstack([x,y])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- 直方图"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "matplotlib中的`hist`会直接画出直方图,但是numpy里的`histogram`只是生成数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 157,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXcAAAD8CAYAAACMwORRAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4zLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvIxREBQAAEfFJREFUeJzt3X+MXWldx/H3h0LVCIqxYyT9QatWY0VkcexiSBAVki5rWhNBuwZ1Ddr4o6Jg1KKmYv0HMVGj1mjRjYhiWVeDIw42Khh/RLADLGh3LY51tWNNdlz5oVFZq1//uHfXy907nXOnd+bePvN+JZOc55xn7/32dO+nzzz3nOekqpAkteVJ0y5AkjR5hrskNchwl6QGGe6S1CDDXZIaZLhLUoMMd0lqkOEuSQ0y3CWpQU+e1hvv2rWr9u/fP623l6Rb0nve855/qaq59fpNLdz379/P0tLStN5ekm5JSf6hSz+nZSSpQYa7JDXIcJekBhnuktQgw12SGmS4S1KDDHdJapDhLkkNMtwlqUFTu0NVmrT9p35vrP4Pve7OTapEmj5H7pLUIMNdkhpkuEtSgwx3SWpQp3BPciTJ5STLSU6NOL4vyTuTvC/JB5K8ZPKlSpK6Wjfck+wAzgJ3AIeAu5IcGur2w8C9VXUbcBz4+UkXKknqrsvI/TCwXFVXqupR4DxwbKhPAZ/S3/5U4NrkSpQkjatLuO8Grg60V/r7Br0WeHmSFWAR+K5RL5TkRJKlJEurq6sbKFeS1EWXcM+IfTXUvgv4laraA7wEeFOSJ7x2VZ2rqvmqmp+bW/cRgJKkDeoS7ivA3oH2Hp447fIK4F6AqvoL4BOBXZMoUJI0vi7LD1wEDiY5APwTvS9Mv36ozz8CXwn8SpLPpxfuzrvolnSjZQxcskC3inXDvaquJzkJXAB2APdU1aUkZ4ClqloAvhd4Q5JX0ZuyubuqhqdupLGsFbIGrLS+TguHVdUivS9KB/edHth+AHj+ZEuTJG2Ud6hKUoMMd0lqkOEuSQ0y3CWpQYa7JDXIcJekBhnuktQgH5CtW864D8Le7NeRZpEjd0lqkOEuSQ1yWkYag+vd6FbhyF2SGmS4S1KDDHdJapDhLkkNMtwlqUGdwj3JkSSXkywnOTXi+E8lub//88EkH558qZKkrta9FDLJDuAs8GJ6D8u+mGSh//QlAKrqVQP9vwu4bRNqlSR11GXkfhhYrqorVfUocB44doP+dwG/MYniJEkb0yXcdwNXB9or/X1PkOSZwAHgHWscP5FkKcnS6urquLVKkjrqEu4Zsa/W6HscuK+q/mfUwao6V1XzVTU/NzfXtUZJ0pi6hPsKsHegvQe4tkbf4zglI0lT1yXcLwIHkxxIspNegC8Md0ryecCnAX8x2RIlSeNaN9yr6jpwErgAPAjcW1WXkpxJcnSg613A+apaa8pGkrRFOq0KWVWLwOLQvtND7ddOrixJ0s3wDlVJapDhLkkNMtwlqUGGuyQ1yHCXpAb5DFVpAny2qmaNI3dJapAjd2kTOaLXtDhyl6QGGe6S1CDDXZIaZLhLUoMMd0lqkOEuSQ0y3CWpQZ3CPcmRJJeTLCc5tUafr03yQJJLSd482TIlSeNY9yamJDuAs8CL6T1P9WKShap6YKDPQeA1wPOr6kNJPmOzClZ71rrRR9LGdRm5HwaWq+pKVT0KnAeODfX5VuBsVX0IoKoenmyZkqRxdFl+YDdwdaC9Atw+1OdzAZL8ObADeG1V/f5EKlQzHKFLW6dLuGfEvuGHYD8ZOAi8ENgD/GmSZ1XVhz/uhZITwAmAffv2jV2sJKmbLtMyK8DegfYe4NqIPr9TVf9dVX8PXKYX9h+nqs5V1XxVzc/NzW20ZknSOrqE+0XgYJIDSXYCx4GFoT5vBb4cIMkuetM0VyZZqCSpu3XDvaquAyeBC8CDwL1VdSnJmSRH+90uAI8keQB4J/B9VfXIZhUtSbqxTuu5V9UisDi07/TAdgGv7v9IkqbMO1QlqUE+iUmaAp/QpM3myF2SGmS4S1KDDHdJapDhLkkNMtwlqUGGuyQ1yHCXpAYZ7pLUIMNdkhpkuEtSgwx3SWqQ4S5JDTLcJalBhrskNahTuCc5kuRykuUkp0YcvzvJapL7+z/fMvlSJUldrbuee5IdwFngxfQehH0xyUJVPTDU9S1VdXITapQkjanLyP0wsFxVV6rqUeA8cGxzy5Ik3YwuT2LaDVwdaK8At4/o9zVJXgB8EHhVVV0d0UfbwFpPGZK0dbqM3DNiXw21fxfYX1XPBv4QeOPIF0pOJFlKsrS6ujpepZKkzrqE+wqwd6C9B7g22KGqHqmqj/WbbwC+eNQLVdW5qpqvqvm5ubmN1CtJ6qBLuF8EDiY5kGQncBxYGOyQ5BkDzaPAg5MrUZI0rnXn3KvqepKTwAVgB3BPVV1KcgZYqqoF4JVJjgLXgX8F7t7EmiVJ6+jyhSpVtQgsDu07PbD9GuA1ky1NkrRR3qEqSQ0y3CWpQZ2mZSRtjbXuEXjodXducSW61Tlyl6QGGe6S1CDDXZIaZLhLUoMMd0lqkFfLaMNc/VGaXY7cJalBhrskNchwl6QGGe6S1CDDXZIaZLhLUoMMd0lqUKdwT3IkyeUky0lO3aDfS5NUkvnJlShJGte64Z5kB3AWuAM4BNyV5NCIfk8DXgm8e9JFSpLG02XkfhhYrqorVfUocB44NqLfjwGvB/5rgvVJkjagS7jvBq4OtFf6+x6X5DZgb1W9bYK1SZI2qEu4Z8S+evxg8iTgp4DvXfeFkhNJlpIsra6udq9SkjSWLuG+AuwdaO8Brg20nwY8C/jjJA8BzwMWRn2pWlXnqmq+qubn5uY2XrUk6Ya6hPtF4GCSA0l2AseBhccOVtVHqmpXVe2vqv3Au4CjVbW0KRVLkta17pK/VXU9yUngArADuKeqLiU5AyxV1cKNX0HSzfLB2RpXp/Xcq2oRWBzad3qNvi+8+bIkSTfDO1QlqUGGuyQ1yHCXpAYZ7pLUIMNdkhpkuEtSgwx3SWpQp+vctb2tdQONpNnlyF2SGmS4S1KDnJaRbmGuOaO1OHKXpAYZ7pLUIKdl9DivipHa4chdkhpkuEtSgzqFe5IjSS4nWU5yasTxb0vyV0nuT/JnSQ5NvlRJUlfrhnuSHcBZ4A7gEHDXiPB+c1V9YVU9B3g98JMTr1SS1FmXkfthYLmqrlTVo8B54Nhgh6r66EDzk4GaXImSpHF1uVpmN3B1oL0C3D7cKcl3Aq8GdgJfMeqFkpwATgDs27dv3FolSR11GblnxL4njMyr6mxVfTbwA8APj3qhqjpXVfNVNT83NzdepZKkzrqE+wqwd6C9B7h2g/7nga++maIkSTenS7hfBA4mOZBkJ3AcWBjskOTgQPNO4G8nV6IkaVzrzrlX1fUkJ4ELwA7gnqq6lOQMsFRVC8DJJC8C/hv4EPBNm1m0JOnGOi0/UFWLwOLQvtMD29894bokSTfBO1QlqUGGuyQ1yHCXpAYZ7pLUIMNdkhrkwzq2GR/IIW0PjtwlqUGO3KUGrfUb2kOvu3OLK9G0OHKXpAYZ7pLUIMNdkhpkuEtSgwx3SWqQ4S5JDfJSyEZ5s5K0vTlyl6QGdQr3JEeSXE6ynOTUiOOvTvJAkg8k+aMkz5x8qZKkrtYN9yQ7gLPAHcAh4K4kh4a6vQ+Yr6pnA/cBr590oZKk7rqM3A8Dy1V1paoeBc4DxwY7VNU7q+o/+s13AXsmW6YkaRxdvlDdDVwdaK8At9+g/yuAt486kOQEcAJg3759HUuUNCmuObN9dBm5Z8S+GtkxeTkwD/zEqONVda6q5qtqfm5urnuVkqSxdBm5rwB7B9p7gGvDnZK8CPgh4Muq6mOTKU+StBFdRu4XgYNJDiTZCRwHFgY7JLkN+EXgaFU9PPkyJUnjWDfcq+o6cBK4ADwI3FtVl5KcSXK03+0ngKcCv5nk/iQLa7ycJGkLdLpDtaoWgcWhfacHtl804bokSTfBO1QlqUGGuyQ1yHCXpAa5KuQtztUfJY3iyF2SGmS4S1KDDHdJapBz7pJcUKxBjtwlqUGGuyQ1yHCXpAY55y5pTTe6j8L5+NnmyF2SGmS4S1KDDHdJalCncE9yJMnlJMtJTo04/oIk701yPclLJ1+mJGkc64Z7kh3AWeAO4BBwV5JDQ93+EbgbePOkC5Qkja/L1TKHgeWqugKQ5DxwDHjgsQ5V9VD/2P9uQo2SpDF1CffdwNWB9gpw++aUo7W4tK+kcXSZc8+IfbWRN0tyIslSkqXV1dWNvIQkqYMu4b4C7B1o7wGubeTNqupcVc1X1fzc3NxGXkKS1EGXaZmLwMEkB4B/Ao4DX7+pVUmaea4kOdvWHblX1XXgJHABeBC4t6ouJTmT5ChAki9JsgK8DPjFJJc2s2hJ0o11WlumqhaBxaF9pwe2L9KbrpEkzQAXDpsxXhUjaRJcfkCSGmS4S1KDnJaRNFFeRTMbHLlLUoMMd0lqkNMykraE0zVby3CfEi95lLSZnJaRpAYZ7pLUIMNdkhrknPsmc25d0jQY7hNiiEuaJYa7pKnyEsnNYbhLmkmG/s0x3Mfk9Is0XYZ+N52ulklyJMnlJMtJTo04/glJ3tI//u4k+yddqCSpu3VH7kl2AGeBF9N7WPbFJAtV9cBAt1cAH6qqz0lyHPhx4Os2o+Ct4ghdurU4ov94XaZlDgPLVXUFIMl54BgwGO7HgNf2t+8Dfi5JqqomWOuGGdSStpsu4b4buDrQXgFuX6tPVV1P8hHg04F/mUSRwwxrSV3NYl5sxW8TXcI9I/YNj8i79CHJCeBEv/nvSS53eP+ttotN+kdpgma9xlmvD6xxUqxxA/LjT9g1To3P7NKpS7ivAHsH2nuAa2v0WUnyZOBTgX8dfqGqOgec61LYtCRZqqr5addxI7Ne46zXB9Y4KdY4GZtRY5erZS4CB5McSLITOA4sDPVZAL6pv/1S4B2zMt8uSdvRuiP3/hz6SeACsAO4p6ouJTkDLFXVAvDLwJuSLNMbsR/fzKIlSTfW6SamqloEFof2nR7Y/i/gZZMtbWpmetqob9ZrnPX6wBonxRonY+I1xtkTSWqP67lLUoO2Zbh3WE7h7iSrSe7v/3zLFGq8J8nDSf56jeNJ8jP9P8MHkjx3Bmt8YZKPDJzH06P6bWJ9e5O8M8mDSS4l+e4RfaZ6HjvWOO3z+IlJ/jLJ+/s1/uiIPlNdgqRjjbPwud6R5H1J3jbi2GTPYVVtqx96Xwr/HfBZwE7g/cChoT53Az835TpfADwX+Os1jr8EeDu9ewyeB7x7Bmt8IfC2KZ7DZwDP7W8/DfjgiL/rqZ7HjjVO+zwGeGp/+ynAu4HnDfX5DuAX+tvHgbfMYI2z8Ll+NfDmUX+fkz6H23Hk/vhyClX1KPDYcgozpar+hBH3Cgw4Bvxq9bwLeHqSZ2xNdT0dapyqqvrnqnpvf/vfgAfp3U09aKrnsWONU9U/N//ebz6l/zP8Zd0x4I397fuAr0wy6ubGTdGxxqlKsge4E/ilNbpM9Bxux3AftZzCqA/T1/R/Tb8vyd4Rx6et659j2r60/6vy25N8wbSK6P+Kexu9Ed2gmTmPN6gRpnwe+9MJ9wMPA39QVWuex6q6Djy2BMks1QjT/Vz/NPD9wP+ucXyi53A7hnuXpRJ+F9hfVc8G/pD//9d0lnRa8mHK3gs8s6q+CPhZ4K3TKCLJU4HfAr6nqj46fHjEf7Ll53GdGqd+Hqvqf6rqOfTuUD+c5FlDXaZ+HjvUOLXPdZKvAh6uqvfcqNuIfRs+h9sx3NddTqGqHqmqj/WbbwC+eItqG0eXZSGmqqo++tivytW7V+IpSXZtZQ1JnkIvNH+9qn57RJepn8f1apyF8zhQy4eBPwaODB16/DzeaAmSrbBWjVP+XD8fOJrkIXpTwV+R5NeG+kz0HG7HcF93OYWhOdej9OZBZ80C8I39qz2eB3ykqv552kUNSvKZj80ZJjlM7/+3R7bw/UPv7ukHq+on1+g21fPYpcYZOI9zSZ7e3/4k4EXA3wx1m+oSJF1qnObnuqpeU1V7qmo/vcx5R1W9fKjbRM/htnvMXnVbTuGVSY4C1+n9y3n3VteZ5DfoXSWxK8kK8CP0viSiqn6B3h3DLwGWgf8AvnkGa3wp8O1JrgP/CRzfyg88vdHSNwB/1Z+LBfhBYN9AjdM+j11qnPZ5fAbwxvQe3PMk4N6qeltmawmSLjVO/XM9bDPPoXeoSlKDtuO0jCQ1z3CXpAYZ7pLUIMNdkhpkuEtSgwx3SWqQ4S5JDTLcJalB/wds4mEqJZ/UegAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "mu,sigma=2,0.5\n",
    "v=np.random.normal(mu,sigma,10000)\n",
    "plt.hist(v,bins=50,density=1)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 159,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "[n,bins]=np.histogram(v,bins=50,density=True)\n",
    "plt.plot(0.5*(bins[:-1]+bins[1:]),n)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "> `np.histogram`返回各个直方条的高度n及直方条的左右边缘值bins，因为一个直方条有两个边缘，最后bins会比n多一个；因为`density=True`所以n被标准化了（即积分为1,不再表示每个条的频数,而是频率密度）"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Matlab到Numpy比较"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 关键差别"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "|                            matlab                            |                            Numpy                             |\n",
    "| :----------------------------------------------------------: | :----------------------------------------------------------: |\n",
    "| matlab中的基本数据类型是双精度浮点数组成的多维数组,其中二维数组的运算或多或少类似线性代数中的矩阵运算 | Numpy中基本数据类型是多维数组`array`，其操作大多是按位操作，线性代数运算需要特殊的函数实现 |\n",
    "|                      matlab索引从1开始                       |                       numpy索引从0开始                       |\n",
    "| matlab是特地为线性代数设计的，矩阵运算非常优雅与简洁，相对来说GUI方面和做成熟的应用方面有欠考虑 | python出发点是作为一个通用编程语言，numpy作为其补充，可以做到许多matlab无法做的事情 |\n",
    "|               matlab数组赋值、切片等使用值传递               |   numpy数组使用引用传递，切片只是生成一个视图，属于浅拷贝    |"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 该使用数组还是矩阵"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "出于历史原因，numpy中也有一个`matrix`类,那么到底该使用数组还是矩阵?  \n",
    "长期上来说`matrix`类将逐渐被弃用,所以当然是选用数组,二者比较如下:"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- `*`与`@`运算符的区别,`dot()`函数与`multiply()`函数的区别。\n",
    "    - 对`array`来说,`*`与`multiply()`是按位乘法,而`@`与`dot()`是矩阵乘法\n",
    "    - 对`matrix`来说,`*`意味着矩阵乘法,而按位乘法必须用`multiply()`\n",
    "- 处理向量（一维数组）方式上\n",
    "    - 对`array`来说,(Nx1)数组、(1xN)数组和(N,)数组是完全不一样的概念,前两个是二维数组，而最后一个是一维数组;`array`中类似A[:,1]的操作返回的是大小为N的一维数组而不是Nx1的二维数组,一维数组既可以当做行向量也可以当做列向量，A@v时v自动看做列向量,v@A时v自动看做行向量;转置一维数组没有意义\n",
    "    - 对`matrix`来说，一维数组总是向上转为1xN或者Nx1的二维数组（行列向量）\n",
    "- 处理高维数组上。\n",
    "    - `array`可以有2维以上的数组\n",
    "    - `matrix`只能有2为数组（即使一维数组也会向上转为二维数组）"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 165,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(array([14, 32]), array([19, 28]))"
      ]
     },
     "execution_count": 165,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "A=np.array([[1,2],[3,4]])\n",
    "v=np.array([4,5])\n",
    "A@v,v@A"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Matlab与Numpy等效语法"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "参考[Numpy for matlab users](https://docs.scipy.org/doc/numpy/user/numpy-for-matlab-users.html#general-purpose-equivalents)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "几点需要注意的:  \n",
    "_______________"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 数组叠加  \n",
    "与matlab中一样，numpy也可以由几个子矩阵叠加生成新矩阵,但是注意用法是使用`np.block`函数而不是`np.array`函数;`np.array`函数得到的并不是我们想要的，而是生成`数组的数组`，即更高维的数组"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 170,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(array([[1, 2],\n",
       "        [3, 4]]), array([[2, 3],\n",
       "        [4, 5]]), array([[3, 4],\n",
       "        [5, 6]]), array([[4, 5],\n",
       "        [6, 7]]))"
      ]
     },
     "execution_count": 170,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a=np.array([[1,2],[3,4]])\n",
    "b=np.array([[2,3],[4,5]])\n",
    "c=np.array([[3,4],[5,6]])\n",
    "d=np.array([[4,5],[6,7]])\n",
    "a,b,c,d"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 168,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[[[1, 2],\n",
       "         [3, 4]],\n",
       "\n",
       "        [[2, 3],\n",
       "         [4, 5]]],\n",
       "\n",
       "\n",
       "       [[[3, 4],\n",
       "         [5, 6]],\n",
       "\n",
       "        [[4, 5],\n",
       "         [6, 7]]]])"
      ]
     },
     "execution_count": 168,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.array([[a,b],[c,d]])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 171,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[1, 2, 2, 3],\n",
       "       [3, 4, 4, 5],\n",
       "       [3, 4, 4, 5],\n",
       "       [5, 6, 6, 7]])"
      ]
     },
     "execution_count": 171,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "e=np.block([[a,b],[c,d]])\n",
    "e"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 行列交叉子集索引"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "numpy中索引几行、几列的交叉处元素时行列数组不能同时索引，因为numpy会自动当成使用数组索引各个维度，应该两次索引（上面说到过）,如下;但是可以使用numpy中的`ix_()`函数，利用广播法则，这样可以一次给出行索引的数组和列索引的数组，索引几行、几列交叉处子集"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 178,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 1,  2,  2,  3],\n",
       "       [ 3, 95, 96,  5],\n",
       "       [ 3, 97, 98,  5],\n",
       "       [ 5,  6,  6,  7]])"
      ]
     },
     "execution_count": 178,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "e[[1,2]][:,[1,2]]=np.array([[95,96],[97,98]])\n",
    "e"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 180,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[1, 2, 2, 3],\n",
       "       [3, 4, 4, 5],\n",
       "       [3, 4, 4, 5],\n",
       "       [5, 6, 6, 7]])"
      ]
     },
     "execution_count": 180,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "e[np.ix_([1,2],[1,2])]=np.ones([2,2])*4\n",
    "e"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### `np.r_`与`np.c_`用法"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "`np.r_`与`np.c_`用法。实际上我也不知道,我觉得文档上写的缺乏规律性，按照文档上的解释生成的数组不一定是示例中所说，\n",
    "可能理解得不太对，留待之后再看(参看`help(np.r_)`)。`np.r_`与`np.c_`主要是生成数组的技巧性东西，以常规方法也是可以生成的"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[0, 1, 2, 0, 1, 2],\n",
       "       [3, 4, 5, 3, 4, 5]])"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a=np.array([[0,1,2],[3,4,5]])\n",
    "np.r_['-1',a,a]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "> 据说`'-1'`是指沿着最后一个轴连接，也即1轴（横向），无异议"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[1, 2, 3],\n",
       "       [4, 5, 6]])"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.r_['0,2',[1,2,3],[4,5,6]]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "> 据说`'0,2'`是指沿着0轴连接，且维度至少为2。那为什么不生成`array([[[1,2,3]],[[4,5,6]]])`？维度是3(大于等于2)，shape是(2,1,3)，也是沿0轴连接"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[1],\n",
       "       [2],\n",
       "       [3],\n",
       "       [4],\n",
       "       [5],\n",
       "       [6]])"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.r_['0,2,0',[1,2,3],[4,5,6]]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[1, 4],\n",
       "       [2, 5],\n",
       "       [3, 6]])"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.r_['1,2,0',[1,2,3],[4,5,6]]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "字符串里的第三个整数的解释看不懂,原文如下:  \n",
    "> A string with three comma-separated integers allows specification of the \n",
    "  axis to concatenate along, the minimum number of dimensions to force the\n",
    "  entries to, and which axis should contain the start of the arrays which\n",
    "  are less than the specified number of dimensions. In other words the third\n",
    "  integer allows you to specify where the 1's should be placed in the shape\n",
    "  of the arrays that have their shapes upgraded. By default, they are placed\n",
    "  in the front of the shape tuple. The third argument allows you to specify\n",
    "  where the start of the array should be instead. Thus, a third argument of\n",
    "  '0' would place the 1's at the end of the array shape. Negative integers\n",
    "  specify where in the new shape tuple the last dimension of upgraded arrays\n",
    "  should be placed, so the default is '-1'."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 特殊数组生成"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[0. 0. 0.]\n",
      " [0. 0. 0.]]\n",
      "\n",
      "[[1. 0.]\n",
      " [0. 1.]]\n",
      "\n",
      "[[1. 1. 1.]\n",
      " [1. 1. 1.]]\n",
      "\n",
      "[[0.98553156 0.44501507 0.20464881]\n",
      " [0.83079775 0.53370093 0.25029308]]\n",
      "\n",
      "[[0 0 0]\n",
      " [0 1 0]\n",
      " [0 0 2]]\n",
      "\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "(None, None)"
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a=np.zeros([2,3])\n",
    "b=np.eye(2)\n",
    "c=np.ones([2,3])\n",
    "d=np.random.random([2,3])\n",
    "e=np.diag(np.arange(3))\n",
    "print(a),print()\n",
    "print(b),print()\n",
    "print(c),print()\n",
    "print(d),print()\n",
    "print(e),print()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 数组自我复制  \n",
    "```matlab\n",
    ">>>a=[1,2]\n",
    "a=\n",
    "    1  2\n",
    ">>>repmat(a,3,2)\n",
    "ans=\n",
    "    1  2  1  2\n",
    "    1  2  1  2\n",
    "    1  2  1  2\n",
    "```"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[1, 2, 1, 2],\n",
       "       [1, 2, 1, 2],\n",
       "       [1, 2, 1, 2]])"
      ]
     },
     "execution_count": 27,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a=np.arange(1,3)\n",
    "np.tile(a,[3,2])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 其他一些线性代数运算"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 0.46666667, -0.4       ,  0.06666667],\n",
       "       [ 1.13333333, -0.4       , -0.26666667],\n",
       "       [-0.83333333,  0.5       ,  0.16666667]])"
      ]
     },
     "execution_count": 29,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a=np.array([[2,3,4],[1,4,6],[7,3,8]])\n",
    "np.linalg.pinv(a)#求伪逆"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "3"
      ]
     },
     "execution_count": 35,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.linalg.matrix_rank(a)#求阶"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 35,  30,  58],\n",
       "       [ 48,  37,  76],\n",
       "       [ 73,  57, 110]])"
      ]
     },
     "execution_count": 36,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.linalg.matrix_power(a,2)#求方阵幂"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(array([[-0.38216036, -0.26160077, -0.88629481],\n",
       "        [-0.48809686, -0.75725051,  0.43397364],\n",
       "        [-0.78467504,  0.59844523,  0.16170461]]),\n",
       " array([13.80083801,  3.63019307,  0.5988059 ]),\n",
       " array([[-0.48874879,  0.80124239, -0.34515974],\n",
       "        [-0.39511323, -0.5560224 , -0.73124868],\n",
       "        [-0.77782399, -0.22101973,  0.58833674]]))"
      ]
     },
     "execution_count": 41,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "U,S,Vh=np.linalg.svd(a)#奇异值分解\n",
    "U,S,Vh.T"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[1.        , 0.        , 0.        ],\n",
       "       [2.        , 1.        , 0.        ],\n",
       "       [1.        , 1.        , 2.44948974]])"
      ]
     },
     "execution_count": 45,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "b=np.array([[1,2,1],[2,5,3],[1,3,8]])#柯列斯基分解(得下三角矩阵)\n",
    "np.linalg.cholesky(b)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(array([[-0.27216553, -0.46004371, -0.84515425],\n",
       "        [-0.13608276, -0.85108086,  0.50709255],\n",
       "        [-0.95257934,  0.25302404,  0.16903085]]),\n",
       " array([[-7.34846923, -4.21856567, -9.52579344],\n",
       "        [ 0.        , -4.02538243, -4.92246766],\n",
       "        [ 0.        ,  0.        ,  1.01418511]]))"
      ]
     },
     "execution_count": 49,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.linalg.qr(a)#QR分解"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 61,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(344,)"
      ]
     },
     "execution_count": 61,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "sig=np.arange(1,345)\n",
    "fa=np.fft.fft(sig)#傅里叶变换\n",
    "fa.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 62,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2.2301670215777326e-13"
      ]
     },
     "execution_count": 62,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.sum(np.abs(np.fft.ifft(fa)-sig)/sig)#逆傅里叶变换"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 65,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[2, 3, 4],\n",
       "       [1, 4, 6],\n",
       "       [3, 7, 8]])"
      ]
     },
     "execution_count": 65,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a.sort()#排序\n",
    "a"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Matplotlib教程"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 入门"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 基本概念"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- `matplotlib`图像中所有的组件都是`Artist`对象（即使是`Figure`本身）,其中`Figure`是顶层对象，下层有`Axes`，`Text`对象，`Line2D`对象等，`Axes`下又有`Axis`对象等\n",
    "- `matplotlib`中是按层级划分的——越往底层对底层实现细节涉及得越多，对图像的控制也越完全；越往顶层越抽象越不涉及底层的实现细节，绘图更简单——最顶层是由`matplotlib.pyplot`提供的状态机环境，通过函数添加绘图元素（线、图片、文本等），基本能够控制所有图像上看得见的效果，至于底层的实现细节无需关心\n",
    "- `matplot`、`pyplot`和`pylab`关系——`matplotlib`是整个包；`pyplot`是`matplotlib`下的子模块，提供类似matlab的绘图函数；`pylab`也是一个子模块，为了方便一起导入了`pyplot`（用于绘图）和`numpy`（用于数组类型和数学运算）,但是因为命名空间污染，将被逐渐弃用\n",
    "- `matplotlib`的绘图输入数据类型是`numpy.array`，其他数组型数据很可能会出问题，最好是转化成`numpy.array`再用`matplotlib`绘图，比如`pandas.DataFrame`以及`numpy.matrix`"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.legend.Legend at 0x26e08843c88>"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "x=np.linspace(0,2,200)\n",
    "plt.plot(x,x,label='linear')\n",
    "plt.plot(x,x**2,label='quadratic')\n",
    "plt.plot(x,x**3,label='cubic')\n",
    "plt.xlabel('xlabel')\n",
    "plt.ylabel('ylabel')\n",
    "plt.title('simple plot')\n",
    "plt.grid(True)\n",
    "plt.legend()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "> 还有一些后端，配置文件设置的概念，没太看懂，参考[Usage Guide](https://matplotlib.org/tutorials/introductory/usage.html#backends)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### `Pyplot`教程"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "1. 基本绘制`plot()`函数  \n",
    "`plot()`函数类似matlab中绘图方法，甚至很多关键字参数都是一模一样的。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- 绘制一维数据。自动把给出的一维数据作为y，数据序号作为x\n",
    "- 两个一维数据分别作为x,y坐标\n",
    "- 用关键字参数设置`Line2D`对象的属性，就像matlab中设置线型、线宽、颜色、标志形状、标志颜色等，参看`help(plt.plot)`；当然也可以通过返回的`Line2D`对象（`plt.plot()`函数返回`Line2D`对象）设置其属性或者通过`plt.setp()`函数来设置线的属性\n",
    "- 用subplot进行多图绘制，格式是`subplot(rows,cols,current)`，但是如果`rows`，`cols`乘积不大于10可以省略逗号\n",
    "- 可以使用`plt.title()`,`plt.xlabel()`,`plt.legend()`,`plt.grid()`,`plt.hold`等设置标题、x标签、图例显示、网格显示、叠加绘图等\n",
    "- `plot()`提供一个关键字参数`data`，允许使用字符串索引的变量作为x,y（如图3）\n",
    "- 可以使用`scatter()`函数绘制离散图也可以设置`plot()`函数的`marker`参数画\n",
    "- 可以使用`gcf()`获取当前图形，使用`gca()`获取当前坐标轴"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 86,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "D:\\ProgramFiles\\Anaconda\\lib\\site-packages\\ipykernel_launcher.py:19: RuntimeWarning: Second argument 'y1' is ambiguous: could be a color spec but is in data; using as data.  Either rename the entry in data or use three arguments to plot.\n",
      "D:\\ProgramFiles\\Anaconda\\lib\\site-packages\\ipykernel_launcher.py:20: RuntimeWarning: Second argument 'y2' is ambiguous: could be a color spec but is in data; using as data.  Either rename the entry in data or use three arguments to plot.\n",
      "D:\\ProgramFiles\\Anaconda\\lib\\site-packages\\ipykernel_launcher.py:21: RuntimeWarning: Second argument 'y3' is ambiguous: could be a color spec but is in data; using as data.  Either rename the entry in data or use three arguments to plot.\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 4 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "plt.subplot(221)\n",
    "plt.plot(np.arange(5),'o')\n",
    "plt.ylabel('some number')\n",
    "plt.title(r'one array plot')\n",
    "\n",
    "plt.subplot(222)\n",
    "x=np.linspace(0,5,100)\n",
    "y=x**3-2*x**2-x+3\n",
    "plt.plot(x,y,'r--',linewidth=3)\n",
    "plt.title('two arrays plot')\n",
    "\n",
    "ax=plt.subplot(223)\n",
    "data={'x':np.linspace(0,1,100)}\n",
    "data['y1']=data['x']\n",
    "data['y2']=data['x']**2\n",
    "data['y3']=data['x']**3\n",
    "line1=plt.plot('x','y1',data=data)\n",
    "line2=plt.plot('x','y2',data=data)\n",
    "line3=plt.plot('x','y3',data=data)\n",
    "ax.set_xlabel('x')\n",
    "ax.set_ylabel('y')\n",
    "plt.axis([0,1,0,1])\n",
    "plt.setp(line1,'color','g')\n",
    "plt.setp(line2,'color','c')\n",
    "plt.setp(line3,'color','purple')\n",
    "ax.grid(True)\n",
    "\n",
    "plt.subplot(224)\n",
    "ax=plt.gca()\n",
    "x1=np.arange(1,21)\n",
    "y1=max(x1)-x1+np.random.random(x1.shape)\n",
    "x2=x1\n",
    "y2=x2+np.sin(x2)\n",
    "plt.scatter(x1,y1)\n",
    "plt.scatter(x2,y2)\n",
    "ax.grid(True)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "2. 绘制文本"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- `plt.text(x,y,text)`中`x`，`y`指定绘制文本的左下角坐标（在`Axes`中的坐标）；`text`指定绘制文本，文本以`r`开头，表示使用原始字符串（字符串的的反斜杠不作为python转义字符），`matplotlib`内置了TeX解析器，所以可以在文本中使用TeX公式，直接用两个`$`符号包起来的就是公式；当然，`r`字面量和TeX公式也可以用在其他的字符串里，比如`plt.title()`，`plt.xlabel()`中  \n",
    "- `plt.annotate(text,xy,xytext,arrowprops)`中`text`指定注释的内容，元组`xy`指定箭头指向的坐标位置，元组`xytext`指定文本位置左下角坐标，`arrowprops`指定一个代表箭头属性的字典\n",
    "- 关于`Text`对象的其他属性参考[文本属性与布局](https://matplotlib.org/tutorials/text/text_props.html)；关于注释的用法参考[注释初级用法](https://matplotlib.org/tutorials/text/annotations.html#basic-annotation)与[注释高级用法](https://matplotlib.org/tutorials/text/annotations.html#advanced-annotation)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 92,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Text(60, 0.025, '$\\\\mu=100,\\\\ \\\\sigma=15$')"
      ]
     },
     "execution_count": 92,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "mu,sigma=100,15\n",
    "x=np.random.normal(mu,sigma,1000)\n",
    "n,bins=np.histogram(x,50,density=1)\n",
    "plt.plot(0.5*(bins[:-1]+bins[1:]),n,'g',alpha=0.75)\n",
    "plt.xlabel('Smarts')\n",
    "plt.ylabel('Probability')\n",
    "plt.title('Histogram of IQ')\n",
    "plt.axis([40, 160, 0, 0.035])\n",
    "plt.grid(True)\n",
    "plt.text(60,0.025,r'$\\mu=100,\\ \\sigma=15$')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 101,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Text(0.5, 1.0, 'just to check out the TeX equation $\\\\int_{0}^{\\\\pi}sinxdx=2$')"
      ]
     },
     "execution_count": 101,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "ax=plt.subplot(111)\n",
    "t=np.arange(0.0,5.0,0.01)\n",
    "s=np.cos(2*np.pi*t)\n",
    "line=plt.plot(t,s,lw=2)\n",
    "plt.annotate('local max',xy=(2.0,1.0),xytext=(3.0,1.5),arrowprops=dict(facecolor='black',shrink=0.05))\n",
    "plt.ylim(-2,2)\n",
    "plt.grid(True)\n",
    "plt.title(r'just to check out the TeX equation $\\int_{0}^{\\pi}sinxdx=2$')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "3. 官方建议  \n",
    "基于`matplotlib`中有两套接口（基于状态的`pyplot`接口和面向对象的接口）,官方建议使用面向对象的接口，即使用`pyplot`生成`figure.Figure`对象与/或`axes.Axes`对象（`Figure`对象是整个图像，包含多个`Axes`；`Axes`对象对应一幅图像），使用`Axes`对象来设置各个属性，参考[A note on the Object-Oriented API vs Pyplot](https://matplotlib.org/tutorials/introductory/lifecycle.html#a-note-on-the-object-oriented-api-vs-pyplot)，比如:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "t=np.linspace(0,2*np.pi,100)\n",
    "y=np.sin(t)+np.cos(t)\n",
    "fig,ax=plt.subplots()\n",
    "ax.plot(t,y,'g-.')\n",
    "ax.set_title('simple homonic wave')\n",
    "ax.set_xlabel('time/s')\n",
    "ax.set_ylabel('amplitude')\n",
    "fig.savefig('test.png')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### `matplotlib`绘图功能概览  \n",
    "参看[Sample plot](https://matplotlib.org/tutorials/introductory/sample_plots.html)，主要有：\n",
    "- 线条绘制`plot()`\n",
    "- 多图绘制`subplot()`\n",
    "- 图片绘制`imshow()`\n",
    "- 等高线绘制`contour()`或者伪彩色图绘制`pcolormesh()`\n",
    "- 直方图绘制`hist()`\n",
    "- 路径绘制\n",
    "- 三维图绘制（plot3d工具箱）\n",
    "- 流线图绘制`streamplot()`\n",
    "- 柱状图绘制`bar()`\n",
    "- 饼状图绘制`pie()`\n",
    "- 表格图绘制`table()`\n",
    "- 离散图绘制`scatter()`\n",
    "- 可视化控件\n",
    "- 填充曲线绘制`fill()`\n",
    "- 时序图绘制\n",
    "- 对数坐标`semilogx()`,`semilogy()`,`loglog()`\n",
    "- 极坐标`polar()`\n",
    "- 图例绘制`legend()`\n",
    "- 本地TeX渲染\n",
    "- 控件内嵌绘图"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 图片显示教程"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "图片显示教程与数据分析处理不太相关，感兴趣可以进一步看看[Image Tutorial](https://matplotlib.org/tutorials/introductory/images.html)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 绘图的全生命周期"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "1. 绘图对象创建  \n",
    "使用`plt.subplots()`即可返回一个`Figure`对象和一个`Axes`对象"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x2aedab44c50>]"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "x=np.linspace(0,10,400)\n",
    "y=0.1*x**2-0.01*x**3+np.sin(x)+0.1*np.random.random(x.shape)\n",
    "fig,ax=plt.subplots()\n",
    "ax.plot(x,y,'c-')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "2. 风格控制  \n",
    "改变绘图风格可使用`plt.style.use()`，欲了解都有哪些支持的绘图风格可使用`print(plt.style.available)`，各种风格差异无非是初始的图像背景色、画板背景色、前景色、线型、网格是否开启、网格线条颜色、边框线型、图像大小等，这些应该都可以自定义"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "['bmh', 'classic', 'dark_background', 'fast', 'fivethirtyeight', 'ggplot', 'grayscale', 'seaborn-bright', 'seaborn-colorblind', 'seaborn-dark-palette', 'seaborn-dark', 'seaborn-darkgrid', 'seaborn-deep', 'seaborn-muted', 'seaborn-notebook', 'seaborn-paper', 'seaborn-pastel', 'seaborn-poster', 'seaborn-talk', 'seaborn-ticks', 'seaborn-white', 'seaborn-whitegrid', 'seaborn', 'Solarize_Light2', 'tableau-colorblind10', '_classic_test']\n"
     ]
    }
   ],
   "source": [
    "print(plt.style.available)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 80,
   "metadata": {
    "code_folding": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Text(0.5, 1.0, 'ggplot')"
      ]
     },
     "execution_count": 80,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 832x572 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.style.use('ggplot')#我觉得seaborn的几个风格和ggplot风格挺好看，classic、dark_background、fast都比较细线条、高对比度\n",
    "fig,ax=plt.subplots()\n",
    "ax.plot(x,y,'c-')\n",
    "ax.set_title('ggplot')\n",
    "#for style in plt.style.available:\n",
    "#    plt.style.use(style)\n",
    "#    fig,ax=plt.subplots()\n",
    "#    ax.plot(x,y)\n",
    "#    ax.set_title(style)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "3. 自定义属性  \n",
    "包括设置`Axes`对象的标题、xy标签、xy刻度、刻度标签及其属性等"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 81,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAtEAAAIuCAYAAAB5DVTLAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAMTQAADE0B0s6tTgAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvOIA7rQAAIABJREFUeJzs3Xl4VOXd//HP7JN9X4CwGlBRATcEpbIUtbbaWkXqo1T0Z/tg1dr2qfqodQGpW+tS16vWtuKGiIhVUFDQWooF3G1xQUDWhOx7Ziaznd8fnMwzIQsZIJlMeL+uq1dnTs7MucMt4ZN7vud7WwzDMAQAAACg26zxHgAAAACQaAjRAAAAQIwI0QAAAECMCNEAAABAjAjRAAAAQIwI0QAAAECMCNEAAABAjAjRAJCg3n33Xc2dO1fhcDjeQ4nZggULZLFYYn7dp59+qrlz56qmpqYHRgUA3UeIBoAE9e6772revHkJGaIP1Keffqp58+YRogHEHSEaAAAAiBEhGgAOsc8++0w//OEPlZOTo6SkJB155JG6++67I18fNmyY5s6d2+51FotFCxYsiDz/4IMPdMYZZygnJ0fJyckaMWKErrrqKknS3LlzNW/ePEmSw+GQxWJpUx5RVlam2bNnKy8vT263W+PGjdMLL7zQ5nqtJRVr167VjBkzlJaWpoKCAt1zzz2SpJUrV+r4449XSkqKTj75ZH388cf7/d4vu+wyFRUVaf369ZowYYLcbreGDx+uxx57bL+vbWxs1M9//nMNHDhQLpdLRx11lB566KE247388sslSSNHjox8z9u3b9/vewPAoWaP9wAAoD/54IMPNHnyZI0cOVIPPvigioqKtHnzZv373/+O6X2ampp01llnafz48VqwYIHS0tK0fft2/etf/5Ik/eQnP9Hu3bv1l7/8RWvXrpXNZou81uPxaMqUKaqpqdFdd92loqIiPffcc7r44ovl8Xh0xRVXtLnW5ZdfrtmzZ+vKK6/USy+9pJtuukn19fVavny5fvOb3yglJUXXX3+9zjvvPG3dulUOh6PLsTc0NGjmzJm64YYbNHfuXC1atEjXXHON0tPT9eMf/7jD14TDYZ177rn68MMPdccdd+jYY4/V66+/rl/+8peqqqrS/Pnz9b3vfU+33HKLfvvb3+qll15SUVGRJGnAgAEx/dkCwCFhAAAOmdNPP90oKioyPB5Pp+cMHTrUuP3229sdl2Q89dRThmEYxgcffGBIMj777LNO3+f22283JBmBQKDN8UcffdSQZPzjH/9oc/zb3/62kZ+fbwSDQcMwDOOpp54yJBnz58+PnBMIBIy8vDzDbrcb33zzTeT43/72N0OS8e6773Y6HsMwjNmzZxuSjBdeeKHN8enTpxtDhw41wuFwm2u3Wr58uSHJePrpp9u87oorrjBcLpdRVVXV5nWbN2/uchwA0NMo5wCAQ8Tj8Wjt2rWaNWuWkpKSDuq9Ro4cqczMTM2ZM0cLFy7U7t27u/3aNWvWqKioSKeffnqb47NmzVJFRYW+/PLLNsfPOuusyGO73a7i4mKNGjVKw4cPjxw/+uijJUm7du3a7/VtNpsuuOCCNscuuugi7dixQyUlJZ2O2Wq16qKLLmo35paWFq1bt26/1wWA3kSIBoBDpLa2VuFwWIMGDTro98rIyNDf//53FRYWas6cORo8eLCOO+44LV26dL+vra6uVmFhYbvjrceqq6vbHM/Kymrz3Ol0dnhMknw+336vn5WV1a7ko6CgQJI6DdHV1dXKzs6OXGd/YwaAeCNEA8AhkpWVJavV2mlQbOV2u9XS0tLmWFVVVbvzxo0bp1deeUV1dXVat26dhg4dqgsvvFAbN27s8v1zcnJUVlbW7njrsZycnP19KweltrZWgUCgzbHy8nJJ6vQXjJycHNXU1Mjv97c53ltjBoBYEaIB4BBJTk7WpEmT9Pzzz8vr9XZ63tChQ/Wf//ynzbHly5d3er7NZtOECRN01113KRwOR8oxXC6XJLW71uTJk7V792699957bY4vXLhQBQUFkdKMnhIKhfTyyy+3ObZo0SINGTKk0xA9efJkhcNhvfTSS22OL1y4UC6XSxMnTpTU+fcMAL2N7hwAcAjdd999mjx5siZOnKhf//rXKioq0jfffKNPP/1UjzzyiKS99cE/+clPNG/ePE2aNEkff/yxnnnmmTbvs3z5cv3pT3/Seeedp+HDh6u5uVkPP/yw0tLSIoFy9OjRkqT7779fZ599tmw2m0466SRddtllevjhh3X++efrzjvvVFFRkZ5//nmtWrVKf/7zn9t08ugJaWlpuuGGG1RVVaWRI0fqhRde0OrVq7vcpfA73/mOJk+erCuvvFKVlZU65phj9MYbb+jJJ5/ULbfcElmJbv2eH3vsMc2ePVsOh0NjxoxpVwYCAD0u3nc2AkB/8/HHHxvnnHOOkZGRYbjdbuPII4807rnnnsjXQ6GQMW/ePGPIkCFGUlKSceaZZxpbtmxp053jq6++MmbOnGkMGzbMcLlcRm5urnH22Wcb69evj7xPMBg0rrrqKiMvL8+wWCxtul3s2bPH+PGPf2zk5OQYTqfTGDNmjPHcc8+1GWdnnS4mT55snHbaaW2Obdu2zZBkPPnkk11+77NnzzYGDRpkvPfee8ZJJ51kuFwuY8iQIcZDDz3U4bWjNTQ0GNdcc41RWFhoOBwOY9SoUcaDDz7Y7hpz5841Bg4caFitVkOSsW3bti7HBAA9wWIYhtHbwX3NmjV6/fXXVVFRIb/fr/z8fE2dOlXnnntup6sUwWBQixYt0po1a9Tc3KwRI0Zo9uzZKi4u7uXRAwA6c9lll2n16tUxdRMBgEQUl5ro9PR0XXDBBZo/f74eeOAB/eAHP9DixYu7rAl87rnn9Pbbb+unP/2p7r77bhUUFGj+/Pmqqak5qLFUVVVp8eLFHd7Ug76H+UoczFViYb4SB3OVOJirxBLrfMUlRI8bN07jx49XUVGRCgoKNGXKFI0dO1aff/55h+d7vV6tWrVKF110kU4++WQNGTJEV111lZxOp956662DGktNTY2WLFly0GEcvYP5ShzMVWJhvhIHc5U4mKvEEut8xb07h2EY2rJlizZt2qRjjz22w3O2bt2qQCCgcePGRY5ZrVaNGTNGX331VW8NFQCwHwsWLKCUA8BhIW7dOTwej+bMmaNgMCjDMDRjxgydc845HZ5bV1cnScrMzGxzPDMzU1u2bIn52lVVVZHfMnbu3Bnp7Yq+z2q1KikpiflKAMxVYmG+EgdzlTiYq8RitVqVlZWlnTt3Ro5lZ2crNze3w/PjcmOhJIXDYVVUVKilpUWbNm3SwoULdemll2ratGntzl27dq0efvhhPfvss5EeoZL07LPP6qOPPtIf/vCHmK69ePFiLVmyRNLezRGeeOKJg/tmAAAA0C/MmTNHtbW1kqQZM2Zo5syZHZ4Xt5Voq9Ua2c516NChamho0AsvvNBhiG5dga6rq4tsHStJ9fX17Vanu2PatGmR0pDW3w5ra2sVCoVifi/0LpvNpqysLOYrATBXiYX5ShzMVeJgrhJL63xdf/31CofDkvauRHemz2y2YhhGu21iW40YMUIOh0OfffaZzjzzTEl7V7L/85//aOrUqTFfKzc3t93SfCgUarfdLPoeh8MhaW/Lw87+e0HfwFwlFuYrcTBXiYO5SiytmzZ1t31yXEL04sWLddRRR6mgoEChUEhffPGFli1bFgnE77//vhYuXKjbbrtN2dnZSk5O1hlnnKFFixYpOztbBQUFWrZsmXw+XyRUAwAAAL0lLiHa4/HoySefVE1NjZxOp/Lz83XxxRdHArHH41FpaamCwWDkNbNmzZLdbtcTTzwhj8ej4cOH69Zbb+1ymR0AAADoCXG7sbCvqaqqopwjATgcDuXl5amyspKPxvo45iqxMF+Jg7lKHMxVYnE6nZ124ugIPVcAAACAGBGiAQAAgBgRogEAAIAYEaIBAACAGBGiAQAAgBgRogEAAIAYEaIBAACAGBGiAQAAgBgRogEAAIAYEaIBAACAGBGiAQAAgBgRogEAAIAYEaIBAACAGBGiAQAAgBgRogEAAIAYEaIBAACAGBGiAQAAgBgRogEAAIAYEaIBAACAGBGiAQAAgBgRogEAAIAYEaIBAACAGBGiAQAAgBgRogEAAIAYEaIBAACAGBGiAQAAgBgRogEAAIAYEaIBAACAGBGiAQAAgBgRogEAAIAYEaIBAACAGBGiAQAAgBgRogEAAIAYEaIBAACAGBGiAQAAgBgRogEAAIAYEaIBAACAGBGiAQAAgBgRogEAAIAYEaIBAACAGBGiAQAAgBgRogEAAIAYEaIBAACAGBGiAQAAgBgRogEAAIAYEaIBAACAGBGiAQAAgBgRogEAAIAYEaIBAACAGBGiAQAAgBgRogEAAIAYEaIBAACAGBGiAQAAgBgRogEAAIAYEaIBAACAGBGiAQAAgBgRogEAAIAYEaIBAACAGBGiAQAAgBgRogEAAIAYEaIBAACAGBGiAQAAgBgRogEAAIAYEaIBAACAGBGiAQAAgBjZ43HR1157TRs2bFBpaakMw9CQIUN0wQUXaOzYsV2+7uqrr1ZlZWWbY6NHj9bcuXN7cLQAAABAW3EJ0Rs3btTUqVNVXFwsp9Op1atX65577tHcuXN15JFHdvnac845R9///vcjz+32uHwLAAAAOIzFJYHefPPNbZ5feuml+uSTT7Rhw4b9hmi3263MzMyeHB4AAADQpT6xjBsOh+Xz+ZSWlrbfc1etWqWVK1cqMzNTxx57rC688MJuvQ4AAAA4VPpEiH755Zfl9Xo1efLkLs87++yzNWzYMKWnp6ukpESLFi3SZ599pt///vdyOp3dvl5VVZVqamokSVarVcXFxbLZbHI4HAf1faDntZbvUMbT9zFXiYX5ShzMVeJgrhKLzWaTJG3ZskXhcFiSlJ2drdzc3A7PtxiGYfTa6Drw1ltv6ZlnntH111+/3xsL91VWVqZrr71W1157rSZNmtTt1y1evFhLliyRJCUlJenpp5+O6boAAADon2bPni2v1ytJmjFjhmbOnNnheXH91WjZsmVavHixbrjhBo0ZMybm1xcWFiotLU0VFRUxvW7atGkaN26cpL0r0ZJUW1urYDAY8xjQu+x2u7KyspivBMBcJRbmK3EwV4mDuUosrfN16623tlmJ7vT83hrYvhYtWqQVK1bopptu0ujRow/oPaqqqtTU1NTpMntncnNz270mFAopEAgc0DjQ+4LBIPOVIJirxMJ8JQ7mKnEwV4nBYrFIkoqLi7t1flxC9FNPPaXVq1frF7/4hQYOHKi6ujpJktPpVHJysiTp/fff18KFC3XbbbcpOztbX3/9tTZt2qRjjjlGqampKikp0fPPP6/c3FyNHz8+Ht8GAAAADlNxCdErVqyQJN13331tjk+ePFlXX321JMnj8ai0tDTy8YfdbteGDRu0dOlStbS0KCcnR2PHjtWMGTPkdrt79xsAAADAYS3uNxb2FVVVVfL7/fEeBvbD4XAoLy9PlZWVfDTWxzFXiYX5ShzMVeJgrhKL0+mMqUTY2oNjAQAAwGEqbBiqCYXiPYweQ4gGAADAAQsahp6vq9M7zc1tjl+0e7eO27pVbzY1xWlkPYsQDQAAgANiGIZuLC/XDRUVurykRLvNspXSQEDvmb2WnzUbSPQ3hGgAAAAckD/U1OiFhgZJUlDSvzweSdInPl/knPe8XjWbfZf7E0I0AAAAYra4vl73VVe3OfahGZ6jQ7TfMLTWDNdvNzXpyC1bdGN5ee8NtIcQogEAABCT0kBAN5o7RqdarRrmcEiSPjRLOD6OCtGStLqpSWHD0O2VlWoKh/Vsfb0+3eecfb3v9erXZWX6xHzPvoYQDQAAcBgzDENrmptVEcPW5I/W1KjF7JL8aGGhzk5NlSRt8vtVHQzqs31DdHOz3mxq0raoVn+P1tR0+v4NoZB+UlqqRQ0N+uGuXfprba0Mw9BnPp8eqK5udxNjPMRt228AAADE31/r6nRbZaVybDatGDJEg8xV5c6UBAJaWF8vSZqYlKQzUlMVkqTaWknS8/X18pkB+yinU1/5/aoIhXRLZWWb91nR1KSvW1o0yuVqd41HampUbbbHC0i6tbJSj9bUqNw85rJY9P7w4cq1xy/KshINAABwmDIMQ381u2dUh0L679JS+fZzE+DDNTVqXU++LidHknRS1O7RT0V147g+avOSMnOle2pycuTYIx2sRu/w+/Vn8z2KnU7l22ySFAnQktRiGHo/zmUehGgAAIDD1AavV9ujSiw+bWnRrWatc0d2BwJ60VyFnpScrAlmIM612yN10RVm2E2xWHRGSoqKnc7I622S7i4o0FkpKZKkVxsbtWOfHaPvrKqS31zJ/l1+vlYOHarpKSk60unUtdnZspjnfbCfmmpJqgmF1FObcxOiAQAADlOLzPZ0VklHm2F3YUOD/ru0VKuamiJhVpIqg0H9sqys3Sp0q5OTkto8H+t2y2axaLoZmCXpnLQ0DXY4dE12tiQpJOkxswxEkjZ4PHrd3Jzlu6mpOiU5WQV2u54eNEjvDBum/83N1VHmOD/Yz0r0U7W1Om7rVv1PD3UCIUQDAAD0Qx96vdrYxWptYyik5Y2NkqRpKSlaMGiQsqx7o+HrTU26rLRU47Zu1dV79uhPtbWavmOH1pnBdVpycrvQfHJUSYcknWB+/QdpabJJckj6WVZW5Gunm6vYL9bXa4ffr7BhaK5ZN+20WPSbqFKQNtcx33ejzydvF6Unz5sr5ksbGtRgro43h8OatXu3ZpeUdPna7iBEAwAA9DMbfT79YNcunbNzp3ZGlWvsDAS0qL5e5cGgljU1yWuuNF+Unq4ih0MvDR6ss1NT5bTsLZqoD4f1t8ZGzausVJUZRM9OTdUjAwa0u+ZJ+4TqE81QPcbt1iuDB+u1IUN0XFTQbl3JDkp6sKZGLzc26t8tLZKk/5eZqWFRZSDRWkN0QGrXBaRVVTCoL80ykaCkd80+1S81NOjvHo9WNzfrjYPcjpzuHAAAAP1M65bbAUn/bG7WJZmZkqRLS0q02e+XXXv7O0tSjs2mb5st6o52ufTngQNVHwppRVOT3mxq0hqPRz7DkNti0by8PF2SkSGLxdLumiOdTmVYrao3V3iPjwrMJ+4TsFuPTUtJ0TvNzXq5oUF/N9vWZdtsutYs9+hI9Ar4Bz5fpC67zfdvhuZWq5ua9P20NL1qrrxL0ltNTbogPb3T6+wPIRoAAKCf+cJc0ZX2bnxyifbeFLg5anW2zgy756elRVaeW2XYbLooI0MXZWTIGw7rY59PwxyOLtvfWS0WjU9K0qrmZg1zOJTXjfZz1+fk6J3mZoWlyEr3r3NylGF25OhIkd2uQrtdZcFgpx061u4Tot9pbtbOQKDN+e96PPIbRrvvvbso5wAAAOhnokP0R2bJw/qoADkxKUl2SZlWqy4zV6k7k2S16rTk5P32j5akm3JzdX5amu4tKOjWOMe43fpO1I2Ho5xOzcrI6PI1FoslUn/9kdercAfdN9aa32tr0K0NhzV3n64jTeGw1u8TtmNBiAYAAEhga5qbNW379kjrOb9haHNUiN7s96suFNIGMzC6LBY9N2iQNh5xhNYPH95p7fGBONLl0iMDBmhSByUWnbkuN1cui0VWSXPz8mTvxspwa0lHfTis971e/aKsTD/YuVNb/H7t8PsjdeAXRwXyN81ykXybLdIm762D2PmQEA0AAJCgDMPQTRUV2uT367dVVQobhrb4/Qrsc94nPl9kJfp4t1tuq1VpNpvSuiib6C1Hu1xaOWSI3hgyRJOjVqW7El0X/aPdu7WkoUEf+ny6srRUf49aXb4wPV3H7LMj4oXp6ZHNYd5qajrgPtKEaAAAgAS1PmqzlJpQSF+0tLQp5Wi1oqlJ35jnndLBTX7xNsrlatO5Y39Gu1xKNlesg1HHv/T7dafZJi/VatU4t7tNn2pJ+kF6us4wb6QsieriEStCNAAAQIJaaJZwtFrr8URCtFVSoXlz3xJzUxVJmtAHQ3Ss7BaLJpolI06LRbfl5WmkWZbiMVeWJyYlyW7umtiq2OnUaKdTZ0YdW9HYKL9hxLwiTYgGAABIQHWhULtex9EheoTTqYlmYG4xA6JNHbebS0R35ufrupwcvTFkiOZkZekPhYWKLk5prcse63ZHdjmcbbbnK3Y6I9uUP1BTo+GbN2vs11/HdH1CNAAAQAL6W2OjfGY4HmCuOK+P2qVwtMsV2fCk1XEul1Ks/SP+DXY49KucHB1t1jyPc7t1tdlf2iJpirnabLVYtKioSEuLinS52YnEYrHo+2lpbd6vKcYdDOkTDQAAkIBeMEs5Cm02/U9Ojq4vL5fXMCK7EI52udqtOp8SQ9eMRPTrnBzl2WzKt9tVHNV1JM9ub9e3+trsbA12OFQRDGqL36/VMba7I0QDAAAkmA+9Xm00yzZmZmRocgfheLTTqaNdLrktlsiKdX+oh+6K3WLR/8vK6ta5SVZrpAWe3zD0vV27YrpW/1jPBwAA6KdChqFNLS0KmUHYGw7r1+XlkvYGuYvS0zXI4dCIfTZDOdrlksNi0bioko6T+3mIPlBOi0U/z82N6TWEaAAAgD7sNxUVmrZjh87duVPb/H7NrazUFrMt29XZ2Rpqli1Eb3CSabVG6qTPNWt/pyQnK6sP9IXuq87bz06J+6KcAwAAoI8IG4ZCkhxmD+SwYWhZY6Mk6bOWFp2xY0ek5vl4t1u/zsmJvPZbycl6xqyTHu1yyWK+x+yMDH0rOVmDu7Ft9+GsOzslRmMlGgAAIA727UvcEg7rzB07dPzWrdpurjR/0dKiuqiuEa0BOsVi0aOFhZGwLUmnJidHgt2xUSUcFotFRzidcsYYEtE1QjQAAEAv+9Dr1QnffKObzdpmSXrf59OXfr9qw+HIJirvmVt1S9JNubnKsFpll3RvQYGGRXWfkKRMm0135OVpWkqKrjBbuaHnEKIBAAB62YK6OlWEQnq6vl41oZAk6VOzv7MkvdHUJMMw9C+z7Vquzaars7L00YgR+tfw4fphenqH73t5VpaeHTRIRZRu9DhCNAAAQC8yDEProlaYPzQffxJ1bFsgoC/9fm0wj01MSpLFYlGS1apBBOQ+gRANAADQi3YGAioLBiPPP/B6ZRiGPolaiZak+6uq1GjWQ5/azzdJSUSEaAAAgF60PmrFWZLe93pVGgyqwizraLWyuTnymBDd9xCiAQAAetG+IfrfLS2Rsg1JGutytfl6vs2mIyjh6HMI0QAAAL2oNUS3btbhNwwtqKuTJFkk/e8+O+edmpwc6fmMvoMQDQAA0EtKAgHtDAQkSedHddj4yKyHLnY69a3kZBVE7Sx4Klt190mEaAAAgF4SXbZxYXp6m7As7d2F0Gqx6KzU1MixidRD90mEaAAAgB60uaVFT9fVqSoYjJRyOC0WHe926+R9VpmPN3canJOVpaOdTl2akaHh1EP3Sfb9nwIAAIAD8XFjo8765hs1hcO6u6pKrevO49xuJVmtGp+UpOVNTZHzW0P0MKdTq4cN6/0Bo9sI0QAAAD3gm5YWff/rr9Vk9npu7fksSRPMFejxUSvRbotFR+3TmQN9F+UcAAAAh1hlMKgf7dihCvMmwovT0zU0qizjdLPO+WiXS8lm541jXS456MKRMFiJBgAAOMTmVlZqhxmg5+Tk6NbsbPkNQ0saGmSzWCIr0XaLRZdlZurPdXWalZkZzyEjRoRoAACAQ2iH36/XGhslSWdnZ2teQYFCwaBcFosu6SAo/yYvTzfk5rIKnWAo5wAAADiE/lhbq9bq53nDhsnajXBMgE48hGgAAIBDpDIY1IsNDZKkb6Wk6OSoDVXQvxCiAQAADpG/1NWpxTAkST/fZ/tu9C+EaAAAgEOgMRTS03V1kvZ22pickhLnEaEnEaIBAAAOgfurq9Vg9oK+OjtbFuqc+zVCNAAAwEH6t8+nv5ir0GNdLn0vNTXOI0JPI0QDAAAcgD2BgAKGoaBh6IbycoUl2ST9rqBANlah+z36RAMAAMTAMAzdUlGhBfX1SrFYNNzp1MaWFknST7KydKzbHecRojewEg0AABCDh2tqtKC+XpLUbBiRAF1kt+u6nJx4Dg29iBANAADQTS81NOh31dWSpEKbTeenpanQZlO61aoHCguVbCVaHS4o5wAAAOiGDR6PrisrkySlWq16pqhIx7hcMgyDThyHIX5dAgAA2I+qYFA/27NHQe1dgXxywAAd43JJEgH6MEWIBgAA6ELIMPTzsjKVh0KSpFvy8nQ6G6kc9gjRAAAAXXi4pkZrPB5J0tmpqfpJZmacR4S+gBANAADQiVVNTbrfvJFwiMOh+wsKKN+AJEI0AABAh75qadHVe/bIkOS2WPTEgAHKsNniPSz0EYRoAACAfVQHg7qspETNhiFJeqCgQGPYRAVRCNEAAAAmv2FoQV2dvr1jh3YFg5KkX2Zn6wfp6XEeGfoa+kQDAABIKg8GdcGuXdoWCESOnZuaql+zCyE6wEo0AAA47NSHQlrV1KSWcDhy7LGamkiAHmi364GCAj02YICs3EiIDrASDQAADitN4bDO2blT3wQCmpOVpdvy8iRJ7zY3S5KOcbn02uDBcrOFN7rAfx0AAOCwYRiG/re8XN+YK86L6+sVMAztDAS01Tx2VkoKARr7FZeV6Ndee00bNmxQaWmpDMPQkCFDdMEFF2js2LFdvi4YDGrRokVas2aNmpubNWLECM2ePVvFxcW9NHIAAJDIFtbX62+NjZHnteGw1nk8beqgp7IbIbohLr9mbdy4UVOnTtXtt9+uu+66S8XFxbrnnnu0adOmLl/33HPP6e2339ZPf/pT3X333SooKND8+fNVU1PTSyMHAACJalNLi26rrJQkZdtsau34vKyxUX83SzmyrFaNpZUduiEuIfrmm2/W9OnTNWzYMA0cOFCXXnqpCgsLtWHDhk5f4/V6tWrVKl100UU6+eSTNWTIEF111VVyOp166623enH0AAAgEf2lrk4+s+/zI4WFOi05WZL0RlOT3jO39Z6ckiIbNxKiG/pEwU84HJbP51NaWloR8LCdAAAgAElEQVSn52zdulWBQEDjxo2LHLNarRozZoy++uqr3hgmAABIYOvNoDw+KUlTUlJ0rpk76sJhecxwPYVSDnRTn+jO8fLLL8vr9Wry5MmdnlNXVydJyszMbHM8MzNTW7Zsiel6VVVVkRIQq9Wq4uJi2Ww2ORyOGEeO3ma329v8P/ou5iqxMF+Jg7k6MJXBYOTGwVNTUuRwOHRuZqZuLC9XKOq86RkZchyiP1vmKrHYzC3dt2zZorDZ+jA7O1u5ubkdnh/3WX3rrbf06quv6vrrr1d2dvYBvYclxo9d3nnnHS1ZskSSlJSUpKefflpZWVkHdG3EB/OVOJirxMJ8JQ7mKjb/NGuhJemsAQOUl5OjPEnTKyr0Zm2tJOmE1FQdM2DAIb82c5VY5s+fL6/XK0maMWOGZs6c2eF5cQ3Ry5Yt0+LFi3XDDTdozJgxXZ7bugJdV1engoKCyPH6+vp2q9P7M23atEhZiNVsYVNbW6ugub0n+i673a6srCzmKwEwV4mF+UoczNWBeWvPHkl761hHBQKqNEP12UlJkRA92e2OHD8UmKvE0jpft956a5uV6E7P762B7WvRokVasWKFbrrpJo0ePXq/548YMUIOh0OfffaZzjzzTEl7a6n/85//aOrUqTFdOzc3t93SfCgUUiCqvQ36tmAwyHwlCOYqsTBfiYO5is06s/vGaJdL7nBYATMknZWUpBEOh6pCIZ2fmtojf6bMVWJorWzobuvkuITop556SqtXr9YvfvELDRw4MFLv7HQ6lWzeKfv+++9r4cKFuu2225Sdna3k5GSdccYZWrRokbKzs1VQUKBly5bJ5/NFQjUAAMC+msJhbWxpkSSdkpTU5mvpNptWDR0qQ1ISG6wgBnEJ0StWrJAk3XfffW2OT548WVdffbUkyePxqLS0tM3HH7NmzZLdbtcTTzwhj8ej4cOH69Zbbz3gWmoAAND/feT1Kmw+Hr9PiJbE7oQ4IHEJ0YsXL97vOVOmTNGUKVPaHLPb7Zo1a5ZmzZrVQyMDAAD9zQbzJjGp/Uo0cKD41QsAAPRr75sherjDoTzazeEQ4b8kAADQ73zg9WpZY6PsFos+8fkksQqNQ4sQDQAA+pWSQEAX794d2YWwVUf10MCBopwDAAD0K7dVVEQCdGvQKXY69Z3U1PgNCv0OK9EAAKDfeKupSSvNntDfTU3VnwYMkN8w5LRYYt7hGOgKIRoAAPQLzeGwflNRIUlKsVg0Ly9PFotFLsIzegDlHAAAoF94orZWpeb+Ejfk5mqgwxHnEaE/I0QDAIB+4a2mJknSEQ6HLsvMjPNo0N8RogEAQMKrD4UiW3tPTUmRnRIO9DBCNAAASHjve71qbWh3anJyXMeCwwMhGgAAJLx15q6EFtEPGr2DEA0AABKCYRja7vcrtM8mKpK03uORJB3tcinLZuvtoeEwRIgGAAAJ4b7qap22fbtuLC9vc7whFNJ/zHroiaxCo5cQogEAQEJ40+y+8VJDg2pDocjxD7xehc3HhGj0FkI0AADo80KGoW8CAUlSQNLyxsbI11rroSXpFG4qRC8hRAMAgD5vZyCglqha6FeiQvR6M0Qf7XQqm3po9BJCNAAA6PM2+/1tnm/werU7EFBTOKx/+3ySpAmsQqMX2eM9AAAAgP3Zsk+IlqS/NTbKbxhqrY6mHhq9iRANAAD6vK/NEJ1mtSrHZtP2QECP1NSoKbz3lsI8m02nsxKNXkQ5BwAA6PNaV6KLnU6dl5YmSZEAnWm16vmiIqVRD41eRIgGAAB9mmEYkZroUU6nfpieHvlahtWqF4uKdIzLFa/h4TBFiAYAAH3anmAwsuo80ulUsdOpX2Rn62S3W4uKinSs2x3nEeJwRE00AADo06JvKhzpdEqSbsjNjddwAEmsRAMAgD5ucwchGog3QjQAAOjTWjtzuC0WFTkccR4NsBchGgAA9Gmt5RxHOJ2yWSxxHg2wFyEaAAD0aa3lHJRyoC8hRAMAgD6rJhRSdWjvnoTFhGj0IYRoAADQZ21uaYk8HkWIRh9CiAYAAH3WOx5P5DHlHOhLCNEAACBudgcCmlNaqr/U1rb72ha/X0/U1EiSjjQ3WQH6CjZbAQAAceEJh3VZSYm+9Pu1vKlJk1NSIkHZMAzdWF6ugHnuvQUFstKZA30IK9EAAKDXGYah68vL9WXURipPRa1GL25o0DqvV5J0cXq6Tk5K6vUxAl0hRAMAgF7357o6/a2xsc2xxQ0NagiFVB4Man5lpSQpx2bTzXl58Rgi0CVCNAAA6FVlwaB+a4bkAptNd+XnS5I8hqEXGhp0bVmZasNhSdLteXnKstniNlagM4RoAADQq973ehU0H99TUKBZGRkqsu+9TevuykqtNTtynJuaqvPT0uI0SqBrhGgAANCrPvf5Io8nJiXJZrHo8sxMSYrcSFhkt+veggJZuJkQfRQhGgAA9KqN5gYqwxwOpZmlGhdlZCjJDMw2SY8OGKAMyjjQhxGiAQBArzEMIxKij3G5IsczbTZdn5urDKtVd+Tn040DfR59ogEAQK8pD4VUFQpJko6NCtGSNCcrS3OysuIxLCBmrEQDAIBeszGqHvpYtzuOIwEODiEaAAD0mJZwWC/W12ubualKaymH1H4lGkgklHMAAIAe80Rtre6trla+zaZ/DR+uz80QnW+zKd9ODEHiYiUaAAD0mNatuytCIb3S2BhZiaaUA4mOEA0AAHrMV1HlG4/V1GhnYG8naEo5kOgI0QAAoEdUB4OqMDtxSNL2QCDymBCNREeIBgAAPeJL82bCjhCikegI0QAAoEdEl3KcErV5SrrVqiEORzyGBBwyhGgAANAjWkN0ssWieXl5kePHuFyymFt8A4mKEA0AAHrEV2Y5x5Eul45zu/XDtDRJ0oXp6fEcFnBI0KARAAAccmHD0CZzJfoop1OS9FBhoebn5yvTyhoeEl+XIXrjxo3dfqNjjz32oAcDAAD6h52BgDyGIUk6yryJ0GaxKMtmi+ewgEOmyxA9f/78br/Riy++eNCDAQAA/cNXUZ05jqITB/qhLkM0wRgAAByIL6M6cxxtlnMA/QlFSQAA4ICFDENrmpvVGLWpivR/nTnybDbl2LkFC/1Pt0N0OBzWa6+9pmuvvVYXX3yxysvLJUlLly7VmjVremyAAACgbzIMQ78sK9N/lZTonF27VBsVpFvLOSjlQH/V7RC9ZMkSvf3225o5c6asUXfVDhgwQG+++WaPDA4AAPRdLzc2amljoyRpi9+vn5aWym8Y8oXD2tYaoinlQD/V7RC9Zs0azZkzR5MmTWoToocOHaqSkpIeGRwAAOibtvn9utn8VLrVOq9XV5SW6sclJWpdkz6alWj0U90O0XV1dcrNzW13PBAIyDBb2AAAgP4vYBi6Zs8eNZv//j9cWKjjzLD8TnOz/uX1StobMsZHbfcN9CfdDtEjR47Uhg0bIs9bt+tcuXKljjrqqEM/MgAA0Cc9W1enT80bB2dlZOiC9HQ9PWiQBpk3EGZYrbokI0NvDBmi4ZRzoJ/q9u2yP/7xj3XnnXdq8+bNCgaDeumll7R7926Vl5dr3rx5PTlGAADQRzSHw/pDTY0kaZDdrrl5eZKkArtdbw0dqk0tLRrrdsvNroTo57odokeMGKGHHnpIK1eulCQ1NDTouOOO03XXXaecnJweGyAAAOg7nqytVbXZhePXOTlKigrLmTabTklOjtfQgF4VU+PG1NRUzZgxo6fGAgAA+rCaUEh/rK2VJBU7nbogPT3OIwLiJ6YQXV5erlWrVqm0tFSSNHDgQE2fPl2FhYU9MjgAANB3PF5To8ZwWJJ0Q06O7Ob9UcDhqNsFS+vWrdMvf/lLff311yosLFRhYaE2b96sX/3qV1q3bl1PjhEAAMRR2DD0UHV1ZBV6rMul76amxnlUQHx1eyX6ueee04UXXqjzzz+/zfFXXnlFzz77rCZOnNjti37xxRdavny5tm/frqqqKs2YMUMzZ87s8jVz587VF1980eZYXl6eHnvssW5fFwAAxKYpHNYv9uzRyuZmSZLLYtG8/PxIly7gcNXtEN3Q0NBhUJ4wYYKWLl0a00V9Pp+Kioo0adIkLViwoNuvmzhxoi6//PLIcyt3/gIA0KNuKi+PBOhBdrv+PHCgxrjdcR4VEH/dTqETJkzosGxj/fr1Gj9+fEwXPeGEE3TxxRfr1FNPlcPh6PbrnE6nMjMzI/9L54YGAAB6TE0opGXmtt7Hu91aOXQoARowdbkS/eKLL0Yep6en69VXX9XHH3+s4uJiSdLWrVu1c+dOTZ8+vWdHafroo490xRVXKDU1VaNGjdKPfvSjDndRBAAAB+9vDQ0KmI+vy8lRts0W1/EAfUmXIfqrr75q83zEiBGSpB07dux9sd2uESNG6Jtvvumh4f2fSZMmKTc3V9nZ2aqqqtKSJUt044036r777lNmZmaPXx8AgMPNiw0NkqRCu13fov8z0EaXIfr222/vrXHsV/Rq95AhQzRq1ChdffXVeuedd9rd7Lg/VVVVqjF3W7JarSouLpbNZouptATxYTe3lG39f/RdzFViYb4SR2/N1UafTxvNrb1/lJkpN9t3x4y/V4nFZn7SsmXLFoXNVo7Z2dmdVj0k7KympqZq4MCBqqysjPm177zzjpYsWSJJSkpK0tNPP62srKxDPUT0IOYrcTBXiYX5Shw9PVevbdkSeXzViBHKYyX6gPH3KrHMnz9fXq9XkrrsIBdTiP7000+1fv16VVdXKxgMtvlab69ae71elZWV6cQTT4z5tdOmTdO4ceMk/V+Hj9ra2nbfE/oeu92urKws5isBMFeJhflKHL0xV/5wWM/u2SNJOjkpSVnNzao0O3Sg+/h7lVha5+vWW29tsxLd6fndfeMVK1Zo0aJFmjRpkj7//HOdfvrpqqys1JYtW3TGGWfENEifz6eysjJJUjAYVF1dnbZv3y673a6ioiJt2bJFjz76qK655hoVFxerrKxMa9as0QknnKCMjAxVVlZq8eLFkqSpU6fGdG1Jys3Nbbc0HwqFFAgEOnkF+ppgMMh8JQjmKrEwX4mjJ+dqVVOTqkMhSdKFaWn8N3GQ+HuVGFp7n7c20NifbofolStX6mc/+5kmTJigf/7znzrvvPNUWFiol19+WVVVVTENcuvWrZo3b17k+erVq7V69erI5iktLS0qLS1Vi1mLZbfb9eWXX+rNN9+Ux+NRVlaWjjrqKF155ZXKycmJ6doAAKBr75irznZJ56alxXcwQB/V7RBdU1OjI444QpLkcrnk8XgkSaeddppuvPFGzZkzp9sXPeaYYyIryd35em5ubp+6yREAgP7sX+a/8ePcbqXT1g7oULc3W8nNzVVtba0kacCAAfroo48k7W2DR1cLAAD6h7JgUFvN0oPTuJkQ6FS3V6InT56szZs3a9SoUTrvvPN0//3364033pDX69VFF13Uk2MEAAC9pHUVWiJEA13pdog+77zzIo9POOEEPfjgg/rmm29UWFioYcOG9cTYAABAL3vPDNEui0UnssU30KkD7hOdn5+v/Pz8QzkWAAAQZ60h+kS3W25rt6s+gcNOlyH60Ucf7fYbXXPNNQc9GAAAED87AwHtMvsZn0opB9ClLkO0ld9AAQA4bETXQ08iRANd6jJEX3XVVb01DgAAEGetpRzJFovGUg8NdImlZgAADjNhw9AbjY3a7vdHjhmGEVmJHp+UJKe5exuAjhGiAQA4zCyoq9NP9+zRWTt3aosZpF9saFCZudU3re2A/SNEAwBwmHmpoUGS1BQO64rSUn3q8+mWigpJUrbNpgvT0+M5PCAhHHCLOwAAkHh2BgL6d0tL5PkWv18/2LlTQfP5gwUFyrMTD4D96fZK9BdffNGT4wAAAL3gjcbGyOMjHA5JigToKzIzNT01NQ6jAhJPt3/VvPvuu5WRkaFvfetbmjx5sgoLC3tyXAAAoAcsb2qSJA2y2/Xy4ME6e+dO7QkGdYzLpd/k5sZ5dEDi6HaIfvLJJ7V+/XqtWbNGr7zyikaOHKnTTz9dp556qlJSUnpyjAAA4BAoCQT0ic8nSfpeWpry7Ha9MniwXm9s1IXp6XKxPwTQbd0O0W63W1OmTNGUKVNUVVWltWvXasWKFVqwYIFOPPFETZkyRccff7wstMQBAKBPesNchZak75llG4MdDl2ZnR2vIQEJ64DuHMjNzdWoUaNUVlamsrIy7dq1S48//rhcLpfmzJmjMWPGHOpxAgCAAxAyDG32++U3DP3N7MpRaLfrBDZTAQ5KTCF6z549+sc//qF//vOf8nq9OvXUU3XHHXeouLhYwWBQS5cu1eOPP64//vGPPTVeAAAQg5+WlurN5uY2x76bmiornxwDB6XbIfrmm2/Wtm3bdNxxx+mSSy7RySefLId5V68k2e12nXnmmXr55Zd7ZKAAACA2m1ta2gVoq6SZ9IEGDlq3Q/T48eN13XXXKbuLuqnMzEy9+OKLh2RgAADg4Cw0yzck6d78fOXYbBrhdOpIlyuOowL6h26H6PPOO68nxwEAAA6hlnBYS8wQfaLbrVmZmXEeEdC/0MsGAIB+6M3mZtWEQpKkizMy4jwaoP8hRJt+W14e7yEAAHDIvFBfL0lKsVh0blpanEcD9D+EaNMzNTXyhMPxHgYAAAdtZyCgNR6PJOm89HSlsIkKcMjxt8oUlPSh1xvvYQAAcNCWRN1QSCkH0DMI0VHWE6IBAP3Au2ZbuxEOh8bSiQPoEYToKB2F6OZwWH+prdVa82MxAAD6sqZwWJ/6fJKkbyUny8KmKkCPOKBtv/urT3w+ecNhJZm1Y95wWD8uKdEGM1x/LzVVd+Tnq9DOHxsAoG/a4PEoZD4+LTk5rmMB+jNWoqP4DUOfmL+9BwxDV+7ZEwnQkvR6U5Mmb9+uDaxKAwD6gK9bWnRLRYWuKCnR7kBAkvSvqH+3JhKigR5DiN7Heq9XhmHof8rKtNqsKTvJ7dZZKSmS9n5MdndVVTyHCAA4zG32eHTB9u2aumOHnqqr08rmZt1aUSFJes9c6BntcinbZovnMIF+jRBtGuxwSJLWeTz6Y22tljY2Str7Q+iZQYP010GD9F/p6ZKkj30+NYRCbV5vGIY+8Xr1Qn19pLn9vgzD0EazZAQAgAN1+/bt+qe50NNqVXOzPvZ6tbGlRZJ0WlJSPIYGHDYI0aYJ5kdeH3i9kZXmAXa7nh80SBnmb/JnpqZKkkJS5EbDsGHo0ZoaTdq+Xefs2qXrysv1q7Kydu9vGIZ+UVams3bu7PDrAAB012dNTZKkI51OPT5ggCTJkPTzsjIZ5jnUQwM9ixBtOtks1whob0i2S/rjgAHKj7qJ8NTkZDnMx++aIfqJ2lrdXVWl7WYtmiS909ys6mCwzfv/ua5OL5ur26uamxU0DAEAEKuAYWizWfd8WnKyfpCWFll1bv23yCrpFFaigR5FiDbt+8Pmlrw8nbTPsVSrNXLsXTMI/7WuTpKUZ7NFyj3Ckt6M+phtg8ej+ZWVkec+w9Bmv78nvg0AQD+33e9XwFyIGel0SpLmZGW1OWes26106qGBHkWINg12OnW0+cPou6mp+klmZofnTTFXrEuCQT1WU6NSc8X52uxs3V1QoEyzPd4b5qpzZTCoOXv2aN8q6X+bXUAAAIjF12bNs/R/IXpqSkrksUQ9NNAbCNFRnh40SH8aMECPDxjQaXP6KVE1Zg9UV0uSUiwWXZieLofFEqmbXuvxqD4U0l1VVao0bzS8JTc30ph7Y9QPQQAAumtzByHaarHov6NWoyeZCz4Aeg67hkQZ5HBokMPR5TmjXS7l2WyqDIXUWvU8MyNDaebHZt9NTdXihgYFJN1XXa3FDQ2SpNOTk3VlVpaWNjbqi5YWVqIBAAekdSU6y2ZTTlTJxo/S07UnEJDTatUkVqKBHsdKdIysFotO3+eO58uiSj9OT05WqlnS0VovbZM0Ly9PFotFY1wuSdLnLS0KcXMhACBGrSvRI12uNp+a2iwW/To3Vz/Pzmarb6AXEKIPwNSoj8lOT05WcVQdmstq1fR9PkabnZmpUWZ4Ps7tliR5DUNburi5sCYU0j+am+UnaAMATOGoG9NHRf3bA6D3EaIPwJSUFOXZbLJJuiY7u93Xv2vWRUtSptWq/8nJiTxvXYmWpP90UhcdNgz91+7durikROfv2qWSqPZ5AIDD155gUB5zw66RUf+eAOh9hOgDkGWzaeXQoXpn2LAOm9lPS0nRALO/9G/y8pQVVbN2tMul1med1UX/vbk5cuPhJz6fvrNzp9bsszMVAODwE90edRQhGogrbiw8QIX2zv/okqxWLRs8WBWhkMaa5RvRXxvldOpLv7/TlegnzVpqi/buQFUTCum/Skp0gtutWRkZ+n5ampKs/P4DAIeDulBI1aGQjnA69XVUiGYlGogvklgPGeBwtAvQrVrrojf6fO1uLvyypUX/NHdDvCQjQ/fm58tp3iDysc+n/ykv1/d27lSN2TbPMAz9raFBj9fUcKMiAPQz5cGgpu/YodO3b9fShobIvTTJVquK9tNNCkDPYiU6Dsa4XFosyWMY2ur3K81qVbLVqgybTU/W1kbO+2lWloqdTk1KTtYz9fVaXF+v2nBYm/x+XVpSohcGDdLdVVV6ur5ekpRts+mijIw4fVcAgEMpaBi6as8e7TE39bqtokIF5qegRyYny2qxtNvIC0DvIUTHwXFRK9Rn7dwpv2HIJum05GSt93olSdOiun4Mczp1W16ebsjJ0c/LyvRGU5M+8fk0cds21Zo3mEjSiqYmQjQA9BO/r6qK/JsgSbXhsGrNleijO7gfB0DvopwjDo5xudT6IVxrC7uQpDUeT+T5T6N2nmrltlr1SGGhJppN9KMDtLR3l0TvPscAAIlndVOTHjU/mTzC4dCEfTZPIUQD8UeIjoMkq1W/zc/XxKQkXZiert/k5uq/0tOVad4sOD4pSd/q5Aek22rVXwcO1LHmDSUnu926Mz9fkuQzDL1n1lMDABLX/dXVkiS3xaI/DRyoewsKFF0BfTTbegNxRzlHnMzKzNSsqJ0OJelus4n+MIejy92m0m02LRsyRJ/7fDrO7VZTOKzbKioUkrSquVnTo/pUAwASS1kwqH+b3ZsuzczUUeaiyc+ys/VwTY0sko5PTZWamuI4SgCE6D7EYbFodDdbFjktFh1vfryXabNpfFKS1nm9Wt3cLMMw2PIVABLUO1H7ApwZteL8q5wcpVqtGuRyaURSkioJ0UBcUc7RT7RuNV4WDOrzTvpPAwD6vtVmOM6wWnVSVC2002LR1dnZunCfTzEBxAchup+ILuFYxe6GAJCQfOGw1pj3tkxJSZGDTxWBPosQ3U8c4XBomNl4/21CNAAkpHVer7xml6bp3DwI9GmE6H7CYrFEfuB+4vOp0mzODwBIHK2lHFbtXYkG0HcRovuRb0f9wH23g1Z3LeGw7qis1F2VlaogZANAn2IYhlabnySelJSkbJstziMC0BVCdD9ySlKSks36ub93UNLxl7o6PVFbq8dqa3Xatm26r6pKHjZnAYA+YZPfr93mAgelHEDfR4juR1xWq04zN2n5R3OzQmZdnSSFDEPP1NVFnnsMQw/W1OjasrJeHycAoK2QYejOqqrI828TooE+jxDdz0w1f/DWhcP6xOeLHH+7uVm7zBWOC9LSNNLplCStaGpSaSDQ+wMFAET8vro60h/62ykpOtL8GQ2g7yJE9zPTolYvoks6Fpir0G6LRXfk5+v3BQWRr71Ow34AiJvXGxv1SE2NJGmYw6GHCwvZMAtIAITofmaww6FicwWjNURv9fv1D/NGwwvS05Vps+lEt1uF9r0bVi5rbIzPYAHgMLcrENCvzLK6ZItFfxk4UJncUAgkBEJ0PzTVrIv+rKVFVcGgno6qhZ5t7nRltVh0jrlBy0c+n0o6KOnYFQjIy42HANAjDMPQDeXlajbvX3mwsFBHuVxxHhWA7iJE90PRJR0/2r1bfzFD9ClJSTom6gf0uWlpkcfL9ynpWNLQoAnbtumy0lIZUTcoAgAOjcUNDZHdCc9PS9M5UT+TAfR9hOh+6JSkJCWZ9XRf+f2SJLukX2ZntznvBLdbAzsp6VhUXy9JWuvx6OOoGxQBAAevIhjUHZWVkqRsm03z8vPjPCIAsSJE90Muq1VnmqUaDkkz0tO1YuhQnb5PyySrxRJZ+fjE59Nus6SjZZ/OHq2BGgBw8MKGoevLy1Vnlsv9Ni+PjVWABESI7qfuzc/XHwcM0Lrhw/VQYaFGd1Jnd64ZtiVpubka/VlLi3xRJRyvNjaq2fxhv6mlRZ94vT04cgDo3+6tro7sTHhGSoq+TxkHkJAI0f1Ums2mc9PSNMDh6PK8491uDTJLOlrrotfvs2V4s2FoWWOjVjc16YwdO3Turl36gCANADFb2tCgR812dkMdDj1AOzsgYRGiD3MWiyVyg+EnPp92BQJabwbkQrs98hHjozU1unLPHoUkGZKep8QDAGKy0efTdeXlkqQ0q1ULBg6kjANIYIRotOnS8UpDQ2SV+dSkJF1gfm1bICBvVInHiqYm2t8BQAyeqqtTi2HIKunxAQM0inZ2QEKzx+OiX3zxhZYvX67t27erqqpKM2bM0MyZM/f7uldffVVvvvmm6urqNGjQIF1yySUaN25cL4y4fxvrcmmw3a5dwaD+WFsrjxmWJyQl6aSkJD0Z1Wd6UnKy1no8agqHtaq5Wd9PS9MGj0fP1dfrquxsHc0/CgDQjmEYetcslTs1OblNK1IAiSkuK9E+n09FRUWaNWuWMs3NP/bn9ddf1+LFizVz5kz97ne/09ixY3Xvvfdq27ZtPTza/s8S1aWjPmp1eUJyso50uTTd/GF/RWamnho4UMlm/d4rDQ0qCQQ0u7RUSxsbNae0VEF6SgNAO5v8fpUFg5L+b0MsAIktLiH6hBNO0MUXX6xTTz1Vjnx7+KgAACAASURBVP3c+Cbt/Q3+tdde09lnn60pU6ZEAviwYcO0bNmyXhhx/3fuPneH59tsGmHOzZMDB+pfw4bpjvx8JVut+o7Z0eOd5mZdtWePGs3gvTUQ0IvUSgNAO++a3TgkaQqr0EC/kBA10ZWVlaqtrW1XujF27Fht2rQpTqPqX8a4XBoS9QvNKUlJkTvGnRaLhjqdka+dn54uSQpK+nCfjVgeqK6mVhrAYakxFNLjNTX6vKWl3df+bpZyFNrtOjLq5ymAxPX/2bvz+Kire//jr+9syWSf7CQhYY+EXUUEcbm41gW0WrHqz7q0tbf7vV1ta7Wtvfe2tr29vbXV6u213gLu4gYou6i0sgqILAECJBCy78lMZub7+4PvTCdhkQDJZJL38/HwYTKZJCc5ZOY95/s5nxOVmuieqq+vBzim9CMtLS38sZ6oqamhzmoxZLPZGDVqFHa7/ZRWxQeyOamp/HdNDQAXJSef8PcxKzWVzMpKagIBAPIcDu5JT+fnVVVUBgL8pbmZr2Vm9soYHVY7vtD/pf/SXMUWzdeZ+5fDh1nc3Mzv6+p4d9QocqzH0JZAgA+sDduXJyXhOsMQrbmKHZqr2GK3uuWUlpYStBYE09PTyTxBpon5WT2d/porVqzgxRdfBMDtdvOXv/wFj8dztocWc76ckMATtbXYDIPbiorIio8/4X1vb2zkdxUVADwzbhyXpKbyXHMzpe3t/HdtLf8yahSeXnxRovmKHZqr2KL5Oj1v1dWx2DqwqjEY5OG6Ol4cPx6Av9fU4LP2i9yYl0dWVtZZ+Z6aq9ihuYotP/vZz2i3XvierPlFTITo0D++hoYGCgoKwrc3Njae8sbESLNmzQqXhthsRyta6uvr8VubPgarDODdUaOwAQnNzVRbTwjH87XkZOo9HqYlJDDR76ehtpbvZmTwxfJyGvx+/rR3L/emp5/1MTocDjwej+YrBmiuYovm6/T5gkG+umdPl9teqqnhz3v2cENKCq8cPgyAHZgcDFJdXX1G309zFTs0V7ElNF8PPvhgl5XoE96/rwZ2JrKysvB4PGzevJnx1it7gM2bN1NcXNzjr5eZmXnM0nwgEKCzs/OMxxrr8q2V/U/6XSQA/2GtpoTue43bTaJh0GqarG9t5f/14lG2fr9f8xUjNFexRfPVc0/U1VHq8wFwd2oqLzU30xwM8v1Dh2jr7OTtpibg6AmxCcEgnWdp34jmKnZormJDqLph1KhRp3T/qLW4Kysro6ysDL/fT0NDA2VlZZSXlwNHa1G++c1vUlpaChz9oWbPns3ixYtZvXo1FRUVzJs3j7KyMq6//vpo/AhyHHbDYKJVArK524ZDEZGBqMzn4ze1tcDRY7wfzMriQWuRpjoQ4GuVlZRbK5DqyiEysERlJXrPnj385Cc/Cb+/bNkyli1bRlZWFo899hher5dDhw7hjdjhfN111+H3+3n22WdpbGwkPz+f7373u4wYMSIaP4KcwJT4eNa2t1Pq89EUCJCiI21FZICq9Pv5bEUFrVa988NZWcTbbNyemsrbra0si2hrF2cYzOnFq3Mi0vcM09TpGHC0Y4fPuhwnp+/N5ma+aNX/PVtQwMVn+VABp9NJVlYW1dXVujTWz2muYovmq2fqAgFuPniQXdbzxhfS0ng4Ozv8cdM0Oej30xoM0hEMUuB0knWWOjRormKH5iq2uFyuE3biOJ6YqImW2DE5oqPH5o6Osx6iRUSizTRNvnjoUDhAz01J4aFuHTcMw+jSe19EBp6YOGxFYkeew0G2VcKxyWoPIyIykGz1ellrPb59KimJX+bknFa7VRGJbQrRclYZhsEUazV6U0cHqhYSkYHmRavbBsCDmZk4FKBFBiWFaDnrQiUdVYEAh9UXU0QGEL9p8qrVQ39qfDxFOsJbZNBSiJazrntdtIjIQLG6tZWaQACAm1NSojwaEYkmhWg56yYpRIvIAPWStQrtMgxuUMs6kUFN3TnkrEu12xnpdLKns5N32tpIqK1lp8/HvWlpTHW7oz08EZHT0hwI8FZLCwBXJCaSpj74IoOaQrT0isnx8ezp7GSr18tW69CcD9rb+dvw4TitTTjr29tJstk4Jy4umkMVETkli1pa6LA2S6uUQ0RUziG94qLj9Ieu9Pt5w7oUuqi5mTkHD3LDgQMcUgN6Eenn9vl8/LymBoA0m41ZOsJbZNDTSrT0iltSUmgKBgmYJhclJHBbeTkNwSBP1NdzTVISP6muBqDNNFnZ2sodaWlRHrGIyPFV+/3cUVFBrbWh8DuZmbjU1k5k0NNKtPQKu2HwBY+HL6WnMyE+njtTU4GjhxR86fBhyiNa361pa4vWMEVETqo9GORzFRXst66YfdHj4W696BcRFKKlj9zj8RA6AHdZa2uXj73b1kZQh7KISD/0enMzH1r7OuYkJ/NgZmaURyQi/YVCtPSJXIeD2d3aQV1h1RTWB4Nst56kRET6k1CbTpdh8OucHGwq4xARi0K09Jkvejzht2clJPCjiBWdd1XSISL9UKi70DkuF26bnjJF5B/0iCB9Znx8PD/KzOSaxER+kZPDKJeLXKvPquqiRaS/8Ztm+CrZhIhDpEREQN05pI/9c3p6l/dnJibyYlMTf2tvxxsMEqeVHhHpJ/b4fOG+0OPUz15EulFikai62Oon3WGabDiFI8J/V13N0LVrWWH1mxYR6S1bI/ZqTFCIFpFuFKIlqmZGHMqy+hNKOlqCQR6trqbc6+WHlZXq6CEivWqb9cLeDoxViBaRbhSiJapyHQ5Gu1wA/L6ujpn79vGtykrWt7cfc9/lra14reC8x+fTZkQROes6I16cb7NWokdrU6GIHIceFSTqIlvf7evs5NmmJuYcPMicAwdYHdFTenG3Eo6nGxr6bIwiMvD9oa6OYbt381+1tQRNMxyix2tToYgch0K0RN0309NZkJ/P19PTme52Y7duX9/RwR0VFbzf1kZ7MMjyboe0LG1tpdw6RUxE5EwETZMn6usB+M/aWt5ta6M5GARUDy0ix6cQLVFnMwwuSUzke5mZvDh0KO8PH84X0tJwGQYm8HB1NataW2mzLrN+PT8fgCDwf1qNFpHTcLizk1KfL/z+dq+XmkAAgE7gX48cCX9MIVpEjkchWvqdAqeTh7Ozw4ezfOT18qPqagCchsFPhw9nknV5dX5TEx3WapGIyKk44vdz1YEDzCor42/W3oruG5sP+/3ht8epnENEjkMhWvqtr3o8ZFqHsVRaT2iXJCaS6nBwr9Vvui4QYGm3Mg8RkZP5n/p66gIBAsBT1tWsVdbjSFK3DYTDnc5jbhMRAYVo6ceS7Xa+nZHR5bbrU1IAmJ2aSpxhALDsBCE6YJpqgyciXTQHAvxfY2P4/aUtLez3+VhndQSanZTElYmJ4Y/rpEIRORGFaOnXPpuayhirBZ4NuNrq5JFoszHD7QZgZWvrMWG5ORBg9oEDjNuzJ3xsr4jIvMZGmiJKwPzAt44cIbRF+dLExC4v3s9XiBaRE1CIln7NYRj8V24uE+Pi+F5mJpmOf5xUf7m1WlQbCLA54rRD0zR5oKqKzV4vTcEg/1Vb2+fjFpH+x2eaPGmVbxQ5nRQ5nQCstVahbRw9AGp8fDxPDBnC19PTuTM1NVrDFZF+TiFa+r2J8fEsLiriq1YddMjlSUnhtyPb373Y3MwrET2ll7S0hGuqRWTwerW5OfxY8EWPh7lWeVjIlPh40qx9GNcnJ/O9zEziVA8tIiegRweJWYVOZ/i0w1CI3uPz8QOrNVW8VTPtB+ZH1ECKyOD0v1YfaI/NxtyUFG5NSenyJHhpQkJ0BiYiMUkhWmJaqKRjq9fLLq+XLxw6FO4n/YchQyi2Qva8hoYux/mKyOByxO/nQ2t/xK2pqbhtNoY4ncyK2ER4acTbIiKfRCFaYtrlEU96Nx08yE7r8IR70tK4OimJu9LSAKgMBHi7pSUqYxSR6FsVUfIVGZy/np5OvGFwfnw8k7WJUER6QCFaYtpUt5sUq2axwdpxf3liIg9nZQFwc3IyiVZZx9M63VBk0FphhehEw+ACq7MPwHluNx+NHMkrQ4fisB4rREROhUK0xDSnYXBJRB3jlPh4Hh8yJPxkmGy3c4u1eej99nb2RRzzKyKDg980WWOdSDgzIQFXt7Acb7NhU4AWkR5SiJaYd1daGgYw1uXiL3l5JHTbTf/ZiBZVr0Z07TBNE1N10iID3qaODhqtK1X/pLpnETlLFKIl5l2UkMBHI0eypKiIjIg+0iHj4+IYYfWDfbW5GdM6yfDeQ4co2bOHrRE9pkVk4FlxgnpoEZEzoRAtA0Kq3X7CekbDMLjROulwl8/Hxz4frzc383ZrK03BYJcjgEVk4FlphegxLhf51gtqEZEzpRAtg8KciEMVXmpq4lcRpxhu0kq0yIBV5fez1Wptp1IOETmbFKJlUBjlcjE+Lg6AJ+vr2dvZGf7YTq+XNqteUkQGlpURpRwK0SJyNilEy6AxxyrpCHS7PQBss1aqRGTgCJomT1qnFCbZbFygPtAichYpRMugEQrRIfdYB7EAbGxvB4527NjW0UGrVqZFYt7C5mY+ttpafj4tjTibnvJE5OzRI4oMGvlOJ9OsQxZyHQ5+mJlJmvWkutmqi/7vujquPnCALx0+HLVxisiZ85lmeO9Dms3G/R5PlEckIgPNsf3ARAawX+fk8FR9PbenpeG22ZgSH8/KtjY2dXTgDQZ50jrVcEVrK5V+P7lWy7w9Ph8mR2urRaR/WtXaysLmZibFxdEQDLLf2vvwtfR0Uuz2KI9ORAYahWgZVIa7XPw8Jyf8fihEl/v9zG9spC7wj4rpVa2t3Jaaym6vl08dOIAJvFVUpCAt0g8FTJOvHD5MQzDICxG35zocfC6idEtE5GxROYcMapMjNhr9MqLtHcBya1f//KYm2k2TDtNkaUtLn45PRE7NR14vDcfZy/Cv6em4VQstIr1AK9EyqE2xaqQBmro9Ab/T1kZ7MMjCpqbwbX9rb+ef+2x0InKq3m9rC7/937m5lPp8pNntfDY1NYqjEpGBTCFaBrV0u50ipzNcOwlwV2oqzzQ20hIM8p+1tVRFlHh80N5OwDSxn+B0RBGJjr9ZHXYy7XZuSk7G0N+oiPQyXeOSQW9KRElHSVwc38zICL//uNVjNqQpGGSH1TJLRPqHgGnygRWiL3S7FaBFpE8oRMugF1kXfXtKCjkOR/h0w9Aa9OiIzYR/i7hsLCLR97HXS6NVjjU9ISHKoxGRwUIhWga92cnJZNvtnONycXNKCgCzuh0P/J2MjHBP6dBlYxHpH9ZG/E1Oj9jnICLSmxSiZdDLcTjYOGIES4uKwr1kI0N0ms3GFYmJ4YNa/t7ejmmaURmriBwrdHUo3W5njFpQikgfUYgWAQzDwBZRR3lufHz4oJWbU1KIs9mYZl0mrg0E2BOxEVFEoidomuGrQ6qHFpG+pO4cIsdhNwz+mp/P2rY2brdaZF0YcZl4bVubDl0R6Qd2+Hzh/tAq5RCRvqSVaJETGBsXx70eD/FWLfS4uDiSrLf/rrpokX4hsj/0hdpUKCJ9SCFa5BQ5DIOpViePtW1tqosW6QN7fT6+U1nJxuO8cK3o7OR3dXXA0Xroc3R1SET6kEK0SA/MtFa6KgMBtnq9UR6NyMDygyNHuG7/fioi9hz8sKqK+U1NfO7QIZoiDj7qCAb54qFD1Fq3fTsjo8u+BhGR3qYQLdID1yQlhd9+s6UliiMRGVj2+Xz8pbGRzV4vTzU0ANAcCITLNeoCAX5vrTqbpskPq6rYbL2QvTUlhbt0vLeI9DGFaJEeGOZyUWIdxLKouRnTNDFNk5ebmvhjXR0t1gYnEemZLRFXdhZbf1vvtLXhj7jPUw0NHOzs5Oc1NTzb1ATApLg4/j07W105RKTPqTuHSA9dm5TEdq+XvZ2d7PT5KO/s5GuVlQDMb2zk8bw8xllBW0ROzbaOjvDbB/1+PvJ6Wd7aChxd7QkCXtNk9oEDVFklHNl2O0/m5YU3/4qI9CU98oj00HURJR2vNjfzk+rq8Pt7Ozu54cABXrRWyUTk1HTfY/BGSwsrrBB9UUICV1kHIIUCdJ7DwUtDh5LvdPbtQEVELArRIj00Ji4u3CP6D3V17LU2QU2Nj8fg6GrZtyorOawDWUROiWmabI1YiQZ4uqGBaiswX56YyA+zssKXToc5nbwydCgj1I1DRKJIIVrkNFxrrUaH6jULnU6eLSjg8SFDwrc/e5zV6PpAgM9VVPDjqiqCapEnAkC53x8+MCXTbgegOWJ/weWJiYxyuXh8yBA+n5bGy0OHUqAVaBGJMoVokdNwbURJB8CPMjOJt9m4LimJ0dbq2ILGRgLdgvLjdXUsa23lfxoaWGZdqhYZ7CJXob+ant7lY8OdzvCK86eSk/lJdjY5Dm3nEZHoU4gWOQ3j4+IYaa2ETXe7w6HaMAzusFptVfj9rI44TS1gml1qpf9gtesSGWxM02RtW1u4H3RkZ47PpKRQFLHKfLlVCy0i0t8oRIucBsMweCovj+9lZPCnvLwu7bVuSUkhznp/ntXvFuCdtjYqIw6LWNfRwTodHy6D0BstLdxSXs6nDhygLhAId+YocjpJs9v5VMSVHoVoEemvFKJFTtOYuDi+npFBulXDGeKx28MdPJa2tlLpP1o5/VxjIwAuwyD0GX/UarQMQoutg4pqAwEeq6sLr0SPt1pD3puWxkink8sTE5lunRIqItLfRK2wbOPGjSxYsICKigo8Hg9XX301s2fPPunnPPzww2zfvr3LbVlZWTz22GO9OVSRHrszNZWXm5sJAE/U1/P19HTesmqgr0pMxGUYvNzczFutrZT6fOFuHyKDQeQVmP+pryfUx2ZifDwA+U4n7wwfHoWRiYicuqiE6D179vDoo49y3XXX8Y1vfIPS0lKefPJJXC4X11xzzUk/d/r06dxzzz3h921qsi/90AVuN6NdLnb7fPypvp7Vra34rE2Gt6akMMTp5OXmZuDoZsNf5eZGc7gifaais5ND/n+cQxjZCHKCDikSkRgSlQT6xhtvMGzYMO68804KCgq47LLLuOaaa3j11VcxP6Htl8vlIi0tLfxfSkpKH41a5NQZhsFvc3PD7bp2+nwA5NjtXJqYSElcHJdal6nfbGkJB2yRgW59RCeOrG6lUBOslWgRkVgQlRC9c+dOJk+e3OW2yZMnU1tbS3XE6W/Hs2HDBu677z6+8Y1v8Nhjj1FTU9ObQxU5bZPj41lcWMiUiGBwS0oKDmvT4ezkZACagkH+rg2GMkist/6t24HfRVyByXc4jtlfICLSn0WlnKO+vp60tLQut4Xeb2hoIDs7+7ifN3PmTDIzM0lPT6empoYXX3yR73//+/zqV7865uudTE1NDXXWhi6bzcaoUaOw2+041by/33NY/WEdMdIntsjp5LXhw/lVdTV7fT6+np2N0xr71WlpfPvIEUxgeVsbs6zWeANFrM3VYNdX8xVaiR4fH8/laWnc1NzMK01NXJ+aqsfgU6S/rdihuYotduuFfGlpKUHrwKf09HQyMzOPe/+YmtUrrrgi/HZhYSFjxozhK1/5CitWrODTn/70KX+dFStW8OKLLwLgdrv5y1/+gsfjOevjld4Ta/P125ycY27LAi48fJi1TU0sa2vjiczMLq3yBopYm6vBrjfnq8Xv5yMrRF+SkUFWVhYvZGbyYUsL4xMTcWmPS4/obyt2aK5iy89+9jParatmt9xyC7feeutx7xeVEO3xeGiI6J8L0Gi1/+rJinJSUhJ5eXmfWALS3axZs8LlJKGNifX19fgjNrtI/+RwOPB4PANmvmbFx7O2qYl9HR2sKS9nbHw8a1tbeb+1lSN+P42BADenpXGVVfoRSwbaXA10fTFfa1paCHVKn2AY4cfuoUBjRK20nJz+tmKH5iq2hObrwQcf7LISfcL799XAIhUXF/Phhx8yd+7c8G2bN28mw1qZOFXt7e1UVlZy3nnn9ej7Z2ZmHrM0HwgE6OzsPMFnSH/j9/sHxHxd7nbzc+vtRQ0NvGu388Oqqi73eb2piQUFBcyI0X65A2WuBovenK+1Vn9ogClOp/5dnCH9bcUOzVVsCF0NHjVq1CndPyrXzq677jr27dvHvHnzqKioYPXq1SxevJg5c+aEf4DS0lK++c1vUlpaCkBlZSXPP/88paWlVFdXs337dn7xi18A8E//9E/R+DFEztgYlyt8xPEzjY38OCJAxxsGNsAPfOHQIfZZHT5EYlVoU2G+w0Ge6p9FJMZFZSV61KhRfOc732HBggW8+eabpKWlMXfu3C49or1eL4cOHcJrnWTlcDj4+OOPeeutt2hra8Pj8XDOOefwpS99iYyMjGj8GCJnzDAMrkhM5H8aGjhsXepzAAsKCpjudjOvsZHvVVXREAzyuYoKXi8sJFUdDCQGBU2TDVbJxvlud5RHIyJy5qK2sfDcc8/l3HPPPeHHx40bx/PPPx9+PzMzk4ceeqgvhibSp65KSuJ/IvYI/Ft2drh04860NHb7fDzV0MCezk7+u66OH/Wg5Emkv1jZ2kqzVWM4Vf2gRWQA0FZokSib5nZTYLU/uictjTu6ba79cVYWY61jwVdZR4eHVPv9eK1gItJf+U2TR6ye/m7D4LoY3CgrItKdQrRIlDkNg1eGDuW5ggJ+dpxVZrthcFliIgAf+3zUWmUfi5ubmbx3L58pL6dTJx5KlPx7dTVT9+7l721tJ7zPc42N7LJq+r+cnk62euaKyACgEC3SD+Q5ncxMSDhhn+jIzhxrrc1ZT1klIBs6OphntYgU6Ut1gQCP1ddzyO/noepqzOO8mGsNBnm0thY4euz9l9QvV0QGCIVokRhwgdtNaDvh+21tVPv9XY4K/3VtLU2BwPE/WaSXrGxtJRSbt3q94Y2DAOva23msro67Kyqotv5tficzkwQdqCIiA4QezURiQJLNxmRrM9b77e0saWkhcs2vLhDg99ZR9iJ9ZXm3Gv2nrasjv6mt5caDB/m3mhret17sneNycWtKSp+PUUSktyhEi8SIUEnHbp+P/7PKNzw2G+Pj4oCj5R0HI5r5m6bJa83NbNNJcNIL/KZ5zEbXN5qbebGpid9Y5Rtw9N/oZQkJ/G7IEOwD8Fh7ERm8FKJFYsSMiN66H1n9069OSuIhazOi1zT5bUR4ebqhgX8+fJi55eU0q9RDzrIN7e00Wp1h5ljdNjqBb1RWYgJxhsFrQ4eydeRI5hUUMM56sSciMlAoRIvEiKluN93PeLs2KYkZCQlcZq1SL2xupjEQwDRN/te6tN4QDHapnxY5GyJLOX6Umck5VhvGkIeysjjP7T7hZlkRkVinEC0SI9w2G+dGrEYn22zMtMLz56ze0h2myctNTfy9vZ09EaUd7ytEy1kWCtElcXHkOZ3cHdHf/NqkJO5KTY3W0ERE+oSadYrEkBlud3hV+crEROKsTgezEhPJdTio9Pv5a2MjJd0unb9/kh6+IqeiLhDg64cP4zVNrkxKYofV9/lyq4f5Z1JS+Ht7O17T5Fc5OVqBFpEBTyFaJIZcmpjIf1pdOG6IOPXNYRjcnpLCb+rq2OHzhQ+2CNnm9VIfCOCx2xE5Hb+oqWGl9WIs8spGKETH22z8fsiQqIxNRCQaVM4hEkOmut08kpXFg5mZXGmFl5DbUlPDf9Chg8DvtC6pm3DSumjTNNnv8+nkQzmunV4v849zoE+G3c65VutFEZHBRiFaJMbc4/HwpfT0Yy6X5zudzIoI1rkOB9/PzAz/kZ+spONXtbXMKCvje0eO9MaQJcb9rLqaIGAAC4cO5Xe5uXw2JYU/qG2diAxiCtEiA8gdEZu5bktJwWO3M9Gqjw6F6Cq/ny0RvaMPdHbymFUi8kpzM23BICLeYJDGQIAlLS3hMo5bUlKY6nZzc0oKv8rNDW9sFREZjFQTLTKAXJ6YyN2pqRzy+/mixwMcPaRls9fLxz4fzzU28sOqKtpNk+9mZPCNjAx+U1tLqI+HzzRZ29bG5UlJ0fshJKqCpskvamp4or4eb0R5T7xh8L2MjCiOTESkf1GIFhlA7IbBz3Nyutx2UUICf6ivB+BfI8o1fllbiwG81NTU5f6rFaIHnPZgkNebm3m7tZVpbjdfsF5gdecNBvlyRQUvH6f++avp6Qxxdu9ULiIyeClEiwxwU91uHIDfet9lGNg42lP6FxEnHA5xODjs97Na7fAGjIBp8mhtLU83NNBsleksbmlhpMvVpX4ejgbtuVu2sNIK0IVOJ3ekpuIyDHLsdq6P6AYjIiIK0SIDXqLNxjS3m/fa20m22fhzXh4NgQBfOHw4fJ/ZycmMcDr5bV0dpT4fFZ2d5GvVMeb9W00Nj1tXISI9cOQIK4cNI8H2j20xz9TXs9I65XJiXBzP5OeT5dBThIjIiWhjocgg8MucHL6VkcEbhYXMSEjg2uRkvmPVt8YZBt/OyOCyiJVJrUbHvnkNDeEAXeh08ofcXL6fmQlAud/PoxFXIQBesVag8xwOXhw6VAFaROQT6FFSZBAY5nLxr902hX0jPZ0p8fFk2O2MdLkoNE2SbTaag0FWt7Zye2oqtX4/dsMgTYe0xJQ1bW38oKoKgDSbjb/m5zPS5cJvmrzZ3MxWr5en6uu5KTmZifHx7Pf52Gj1Eb8xNZVEm9ZXREQ+iR4pRQYpwzC4NDGR8dZhGU7DCLcse7etjV/V1HDu3r1ctG8fFZ2dJ/tS0s88WFWFH3ACT+XlMdLlAo6ebPloTg52jh7I88CRIwRNk9daWsKfe1NEm0QRETkxhWgRCbvECtENwSD/WVeH33r7iePU1Ur/VOX3s9s69v2LHg/Tu/VynhAfz71paQBs9np5pbmZV60OLaPcbibqBEIRkVOiEC0iYZd169gQOotufmMjdYFAl4/t9fmYfeAA1+zfT1O3j0n0rIs43v1Eh6H8S0YGHqtk48dVVXxsC24dzAAAIABJREFUhe7bsrOPOQlTRESOTyFaRMIKnU6uTUoi3jD4eno6TwwZAkC7afK/EavRa9vauOHAATZ0dLDV62VxRDmARNcHVoi2Aee63ce9T6rdznesTYYNESdU3pad3evjExEZKBSiRaSLJ/Py2DFqFN/LzOTapCTOsepp/9zQQLXfzx/r6vhseXmX8LXV643WcKWb0Ep0SVwcSSfZIHhHamp4bgHGxsUxrtuVCBEROTGFaBE5htO6pG8YBl9JTweOrlhO3buXR2pq6ATsHO38APBhR0eURiqR2oJBtlkvaKaeYBU6xGEYPJSVFX5fGwpFRHpGIVpETmp2cjJDrZ7BoR4dBQ4Hf83P5zrrFLvtXi9+04zSCCVkY0cHoer0TwrRAJckJvLv2dncl5bG/d1aIIqIyMkpRIvISTkMg59kZxNvGIyLi+P3ubm8O3w4lyQmMjEuDjh6hPgua3NaazDIB+3tBBSq+1zkpsKpp9hl4660NH6anY1bvaFFRHpEh62IyCe6OimJPaNHH3N7ZDu0LR0dlMTF8ZXDh1na2sqliYks0epmryj1+Vja0oLdMHAbBpPi45kYHx8O0QUOB3k6tl1EpFcpRIvIaSt2uXAZBj7TZEtHBxcnJLC0tRWA1a2tzN2+nT/m5ER5lANLwDT5bHk5h/z+Lrd/NyODDVZt+qmUcoiIyJnR9TsROW1xNhtjrQ4PW7xeXm1u7vLx12pr+Up5eZfSjsOdnfxnbS0HdQriaVnf3n5MgAb4ZW0tLVbHFIVoEZHepxAtImdkglXSsd3r5SXr5Lt8h4Nx1u0Lm5pYGBGuv1xZya9qa/n2kSNn/L1N06TmOIFyIHvbWukHeLuoiJcLCsi227vcRyFaRKT3KUSLyBmZZIVlr2myw9pc+OmUFJ4vKsJjdfV4trERgD0+X/gwkL+3tdEW0Wv6dHy5spJJe/eGv3407PP5aD/Fn6PlJPdrDAT4S0MDVSd5UWCaJm9ZB9tMjItjXFwc0xISeK2wkJFWDXS23U5xRP9nERHpHQrRInJGQh06It2YnEyWwxE+Ae/99nbKOzt52VqphqPt8tZHdJPoqbZgkDetFe43upWR9JX5jY3MLCtjxr59vNLUhGmarGpt5Y7ycm4rL6fCKlkJmibfrKykuLSUJyJOfox0/+HD/KCqis8fOnTC71fq87HP+ppXJSWFbx/qdPJqYSEPZmbydH4+dh3dLSLS6xSiReSMFMfFERcR2sa6XJxjBevP5eaGb3+hqSlc7hGy9gxC9JaInsihFfC+FnpRUBUI8NXKSqbs3csdFRWsamtjTVsbt5WXU+3380hNDS9Y932moeGYr/N36/4AGzo62HyCw2siSzkiQzSAx27nS+np4SsDIiLSuxSiReSMOA2DkojV6DkpKeG3L0hOZqRVWvDHujoOditVWGsFx+7MU+gxvTEiaB72+2kMBE5y77OvIxjsMgaAamsMoQfWvZ2dXL1/f5fV57LOTg5121T527q6Lu8/fZygDYRLOQocDkpUsiEiElUK0SJyxiJLOuZYpxjC0WPD56alAdBqBWMbcFViIgCbOzqOqYt+rrGRYbt3M2PfPr5dWckbzc3HPbile4Dd1Qur0Qc6O3m4qoqNx1kx39DRgdca18NZWdyRmkqR08lXPR7WjxjBjdbv4YgVrF0Rq/XvR3y9De3tvGO9mAg9IL/W3ExdtxcF1X5/+Ge+OikJQyUbIiJRpRAtImfsnrQ0JsXF8c30dAq7HfJxS2oqkXFvZkICN1qr1d3rohsDAX5SXY0f2N/ZyYKmJu4/fJj/6bYya5omG7oF2x1e79n8kagPBLitvJwnGxr458OHj1kdfz9iFf36pCR+mZPD+8OH80BWFjkOB7/NzQ2/WIg3DP6anx8ue4n83NAqtB14xKoh95omz3fbLPlWSwuhEXQv5RARkb6nEC0iZ2x0XByLior4TmbmMR8rcLmYEdFy7eaUFKZHvB9ZF/14fT2N1sr0+Lg4QnH8lW611If8fqq6rdTuPIsr0QHT5CuHD7PfKrso9/v5qFtID60mD3c6GXKc0wGdhsETeXn8ccgQ3ioq4qKEBM6z6pVDIXpLRwcrrDrnm1NS+H/WajbAM42NBK3gvrq1lZ9UVwOQarMxTS3sRESiTiFaRHrd5z0e4Gj/6E8lJZHtcDDKqukN1UVX+/08ZdUOl8TFsbiwkC9Yn7fF66U8oo54Q0QpR6hD8tlcif5lTQ2ru9VrR27qawsG2WSF6IsSEk74dVyGwezk5PDPOsO670G/n4Odnfy2thY4+kD8tfR0bIbBXampwNGV+M9WVPDT6mruqqigzQrUP8rKwqlSDhGRqFOIFpFed1VSEiuKinizsJBE29GHndBqdKgu+r/r6sJB8XsZGdgMg2siyhYWW5vqgHCNsg34J6tkYofXe0obEk+mzOfjC4cO8XsrzA93OsMrw0sjvv+69nZCkX7GSUJ0d5GB+6n6et6ygvmNycmMsIL2rampuK2Q/G5bG0/U1+MHHMDvcnO53QrZIiISXQrRItIniuPiyLIOXwGYbgXKTuDSsrJwR4rz4+O53ArGU+LjybVO4+sSoq2V6GKXK1wiUR8MUtOtxKM9GOS9trbjHoZimiYfe7083dDAT6qrua+ign/av59F1vdJsdn4c14en7KC/Bavl8PWanhkTfOMHpRWTI6PDwfkp6yf1wC+np4evk+63c68/Hw+nZxMlvWzJxgGT+fnc3NE5xMREYkuxyffRUTk7JvudmMDghytcQ75XmZmuPNEaDX66cZGPmhvp9rvJ8VmY5tVunGu2x3uSQ1H+0WHgnpzIMCny8vZ7vUy3Onkv3JzOc/tZltHB/MbG1na2trl+0a6PimJH2VlMdTp5MrERB63VqaXtbby/9LSeM9aCR/jcnV5YfBJXIbBVLc73I0D4IbkZEZ3O7BmWkIC0xISME2TUp+PNLu9R99HRER6nx6VRSQqsh0OHs3JYXFLCy7DIN4wmJmQcEx5xKeSk3m6sRGTox0qxsXFhVvLnRcf3+WI651eLxcnJOA3Tb50+DDbrbC9r7OTGw8eZGxc3DEbBOHoJbk8h4MxLhdfSU/nwogxnO92k2az0RAM8nZrKzckJ7PFWgnvySp0yIyEhC4hOnIVujvDMI4J2CIi0j8oRItI1NyWmsptn1Dje2FEiH2uqYm8iBXZc+PjGep04jYM2k2TnVZd9A+rqlhlBdXRLhf7fD780CVAX+h2c0ViIpclJjLa5cJxgs16DsNgVmIiLzc3815bGzccOBA+KbEn9dAhkcH72qQkxioki4jEJIVoEenXHIbB1UlJPNfUxMaODjZat3tsNka6XNgMg2KXi81eLzt8Pn5TW8tfrR7LxS4XC4cOpayzk28fOUJFZye3pKTwubS08Ea+U3FVUhIvNzfjNU32WnXRF7rdp9WveXJ8PNcmJbHL5+OB47QEFBGR2KAQLSL93uzkZJ6L6BU9IS6Ob1sdPODopsXNXi+bOjrCmw6z7Xaeyc8nxW5not3OW4WFAKd10t9lCQm4DAOfaWIHvpGezjcyMk64en0ydsPgyby8Hn+eiIj0LwrRItLvXZaYyG9ycqgPBLgqKemYVeRiqyQi1OAuw25nQUEBBRGHoJzJMdnJdju/yM5maWsr93s8nK/DTkREBj2FaBGJCXNPUjt9TkSoTrfbeb6goEvXjrPh1tRUblWPZhERsShEi0jMu9DtZmp8PPXBII8PGXLWA7SIiEh3CtEiEvPibDYWFhZimuYZlW2IiIicKp1YKCIDhgK0iIj0FYVoEREREZEeUogWEREREekhhWgRERERkR5SiBYRERER6SGFaBERERGRHlKIFhERERHpIYVoEREREZEeUogWEREREekhhWgRERERkR5SiBYRERER6SGFaBERERGRHlKIFhERERHpIYVoEREREZEeckTrG2/cuJEFCxZQUVGBx+Ph6quvZvbs2Z/4ea+++ipvvfUWDQ0N5Ofnc8cddzB58uQ+GLGIiIiIyFFRWYnes2cPjz76KJMmTeKXv/wln/nMZ3juuedYsmTJST/vzTff5Pnnn+fWW2/ll7/8JZMmTeIXv/gF+/bt66ORi4iIiIhEKUS/8cYbDBs2jDvvvJOCggIuu+wyrrnmGl599VVM0zzu55imyWuvvcanPvUpLrvsMgoKCrjzzjsZNmwYr7/+eh//BCIiIiIymEUlRO/cufOYEozJkydTW1tLdXX1cT+nurqa+vr6Yz5v0qRJ7Ny5s9fGKiIiIiLSXVRqouvr60lLS+tyW+j9hoYGsrOzj/s5kfeL/LzQx05VTU0NdXV1ANhsNkaNGoXdbsflcvXo60jfs9vtADgcDgzDiPJo5GQ0V7FF8xU7NFexQ3MVW0LzVVpaSjAYBCA9PZ3MzMzj3j9qGwvPpp7+w1yxYgUvvvgiAB6PhyeeeAKPx9MbQ5NeovmKHZqr2KL5ih2aq9ihuYotjz76aHiB9pZbbuHWW2897v2iUs7h8XhoaGjocltjYyNw7Epz5OcAx/28E33OicyaNYtHHnmERx55hM985jPcf//9lJaW9uhrSHSUlpbyuc99TvMVAzRXsUXzFTs0V7FDcxVbSktLuf/++/nMZz4TzomzZs064f2jshJdXFzMhx9+yNy5c8O3bd68mYyMDLKyso77OVlZWXg8HjZv3sz48eO7fF5xcXGPvn9mZmaXpfn6+vrwsr30b8FgkPb2ds1XDNBcxRbNV+zQXMUOzVVsCQaD1NfXU1hYyJgxYz7x/lFZib7uuuvYt28f8+bNo6KigtWrV7N48WLmzJkTLs0oLS3lm9/8ZvjVm2EYzJ49m8WLF7N69WoqKiqYN28eZWVlXH/99dH4MURERERkkLI//PDDD/f1N01PT2fEiBEsW7aMl156iT179nDjjTdy3XXXhe9z+PBh3njjDWbOnBneaDhmzBgcDgcLFy7k9ddfp62tjS996UuUlJSc9lhM08TtdlNSUkJCQsIZ/2zSuzRfsUNzFVs0X7FDcxU7NFexpafzZZgnaswsIiIiIiLHFZVyDhERERGRWKYQLSIiIiLSQwrRIiIiIiI9pBAtIiIiItJDCtEiIiIiIj2kEC0iIiIi0kMK0SIiIiIiPaQQLSIiIiLSQwrRIiIiIiI9pBAtIiIiItJDCtEiIiIiIj2kEC0ip2znzp3RHoKISFQFg8FoD0H6CYVoETklixYt4sc//jFr166N9lBERKLGZjsanTZs2EBtbW2URyPRpBAt/YJpmgA0NTVFeSRyIqNGjeLiiy/mmWeeUZCOEVox6/80R7HHNE1KS0v5zW9+Q319PaB57K9C2eJE75+pARmiz/YvSXqfYRisWbOGn/70p9TV1UV7OBJh1apVAIwZM4brr7+ekpISnn76aQXpGBBaMVu2bFn4BaoeH/uPYDAYnqP169fz9ttv8+GHHyqQ9XOGYTBq1ChGjx7NSy+9hGma4XmU/sM0TQzDAODll1/mnXfewTCMs/oYaH/44YcfPmtfLYr8fj82mw2/34/dbmfHjh289957bNy4kbi4OBITE3E4HNEepnQT+kfe1tbGggULuOiii5g4cWK0hyWWV199lW3btnHBBRdgs9lIS0sjMzOTxsZG3n77bTIzMxk6dGi0hykn0dbWxn/8x3/Q2dnJxIkTw08qEn2hufjrX//KvHnzKC8vZ/HixbS0tJCfn09iYmKURyhw9MVO5N9NKG8AbNmyhbFjx5KamnrM/SR6Il+glpeXs2zZMt544w1GjhxJXl5el4B9JgZEiF6xYgUvvfQSkydPJj4+nvfff59f//rXNDY2cvDgQd544w06OzvJyckhKSkp2sOVCIZhsH37dl588UVsNhtz5swhLi5OD0T9RG5uLpdeeikOh4OPP/6YrKws0tPTFaRjiN1up7m5mQMHDnDBBRdoMaEfiHwCLy8v59VXX+Vb3/oWc+bMYeTIkfz1r3+ltbWVYcOGKUhHUSgsR85VSkpKOJylp6fz+uuvY5qmXqD2I5FXBp599lmWL1+OYRjU1dXxzjvvUFBQwNChQ89KkI75EG2aJuvWrWPXrl3s37+foqIiFi9ezHXXXcfdd9/NtddeS1JSEq+//jo2m43i4uIufxQSXX6/n1WrVvH+++/T0tLCzTffjGEYBAIBXR6LskAgQEJCAjabjU2bNvG73/0Or9fLuHHjFKT7qeOthBmGQVJSEgsWLGDYsGEUFBREaXQSEpqjhQsXsnPnTtLT07n88stxuVwUFBQwYsQI5s+fT1tbG0VFRQrSUfDrX/+aiooKxowZg91u55133uGPf/wjGzduZMiQIQB4PB6cTidr166lpKSElJSUKI9a4B9/X0uWLOGVV17h/vvv56qrruK8887D6/XywgsvMHTo0LMSpGM+RBuGwdixY/F6vWzbto1du3bR2NjINddcQ0pKSrh2yeVy8cILLzBt2jQ8Hk+0hz3ohf7h2mw2cnNzcTqdbNy4kaamJqZMmYLNZtOlsSiKfCW/d+9eRo4cyZEjR9i2bRtNTU2UlJSEg3RTUxPLli0jOTmZYcOGRXfgg1zo76W0tBSHw0FcXBxwdMWsqqqK3bt3M2XKFJxOZzSHOWhFPmH7fD5Wr17N0qVLcbvdXHzxxeH75OfnM2LECJ599lmOHDlCSUkJbrc7mkMfdPbv38/ChQtxu90UFxeTkpJCXl4e+/fvZ8WKFaxfvx6Xy4Xb7WbLli2MHj2aIUOG6HmrnwgGgyxatIihQ4dy7bXX4nK5yMjIoLCwkCNHjvDKK68wYsSIMy7tiPkQHQwGsdvtjB49mpaWFnbu3MmhQ4e44YYbSEhIwOfzYbfbGTlyJKtWrSI5OZni4uJoD3vQCv1jDdWuBwIBkpKSyM3NJS4ujjVr1tDY2Bi+NKYHpL4X+YAyb948/vSnP3H99dczevRoqqqq2Lx5M83NzV2CdEVFBYcOHeKiiy6K8uhl165d/OhHP2LPnj0cPHiQUaNG4XQ6cTgcLF68mIsuuojk5GT9bUVB5O/bbrdTXFyMYRi8++675ObmUlRUBPwjSBcUFLBt2zauueYazVUfmzBhAg6Hg/nz5+NwOJg8eTKFhYVccskl5OXl4XA4ePnll+ns7GTHjh0cOXKE6dOn43K5oj30Qan745lhGGzevJm6ujouvPBC7HY7QPixb926dbz33nvhFenTFfMhOvRLs9lsjB49Gp/Px65du9i3bx9TpkzB7XYTDAbxer2sWrWKcePGMWLEiCiPenAKhbOtW7fy0ksvsXz5cnbv3s2oUaNIS0sjJycHwzBYvXp1lyAtfSv0O9+3bx8bNmzgvvvuY8iQISQkJFBUVER1dTWbN2+mpaWFkpISPB4Pw4cP5+qrr9Z8RUHo7yr0/4yMDCZMmIDNZuOdd95hzZo1lJWVMWnSJHbs2MGhQ4eYOnWq5ipKXnvtNd58802mT59OXFwcI0aMoL29neeee468vDwKCwuBo/M6dOhQZs2apQWFPhT5ez7nnHNwOBw8++yzuFwuioqKcDqd5ObmMn78eCZPnozT6aSjo4MDBw5QUlJCdna25ioKQr/vsrIy0tLSADh8+DDvv/8+w4cPJysrK3x1tbGxEcMwGDNmDCtXrmTKlCmnvV8uZkN06Amjrq6O9vZ2amtrSUtLY/To0djtdrZv386WLVsoLi6murqaVatWsW3bNm6//XZtLowSwzD44IMP+O1vf8vo0aNJTU1l586drFixgmnTppGenk5OTg42m43XX3+dQCDAuHHjoj3sQWnVqlW8+eabdHR0cP3112Oz2TBNk8TERIqKiqipqeHDDz/kyJEjTJo0KVw6pSePvhW5A72trS18W05ODsXFxVx77bX4/X4qKiqYP38+Pp+PxsZGpk2bhtvtPms71OXUmKbJkSNHeO2116ipqeH888/H5XIxZsyYcJAeMmRIOEhHvjjSPPWN7r/nsWPH4nA4WLBgAYmJiQwbNiy8OTctLY0RI0Zw6aWXsn79eiorK7nwwgs1V1HywQcf8Pvf/x6Xy8XIkSMpLi7m448/ZunSpWRlZeFyuQgGg8yfP5/MzEwmTZrEihUrOPfcc8nOzj6t7xmTITr0oLJ+/XqeeuopVqxYwVtvvcWRI0cYNmwYkyZNwufz8be//Y23336bAwcOEAwG+fznP6/NT1G0e/du/vSnPzF37lxuvvlmCgoKWLRoEfX19axZs4aZM2eGywNSUlKYMWMGycnJ0R72oLRu3To2b95MfX19+PK/aZpdgnRZWRk+n48LLrgg/KShJ4++Exmg33jjDRYuXMjbb7/Njh07GDt2LPHx8eHVlosuuii8Qe2jjz4iPj6esWPHar56WehFZWQQLiwspKCggJdffpkjR44wderULkF63rx5nHPOOeTk5AD6m4qG0NWCUCCODNIJCQkMHz48XB4Q2e7u448/Zvr06eqAEyU+n4+qqiq2bt2KaZqMHDmSiy++mF27drFy5UqWLVvGe++9R1tbG9/97ndxuVysW7eOCy+8kIyMjNP6njERoruvlhiGwaZNm/jNb37DjTfeyGc/+1mys7N54YUXGDNmDIWFhYwaNQqHwxHu2HHfffed9isNOT0HDhzg1VdfZdKkSQBs3boVgLlz51JdXc1PfvITJk6cyNy5c3nnnXdYv349F1xwAZmZmYwePVo7nfvI8VaPx40bh9PpZPfu3VRWVjJs2LDwC5pQkB47diwzZ84Mr1Lryb7vRAboefPmsWTJEmbNmkVRURHr1q1jzZo1XHjhhcTHx4ef5PPy8hg7diw2m40tW7Zw/vnn43Q6NW+9KPS7PXDgQPgSs2EY5OfnM2TIEF555RWqqqrCK9KjRo0iNTWVGTNmqDtRlEReLaitreW8887rEqSfffZZ3G53eEU6NE9LliyhpqaGWbNmKUT3geM9b3k8HvLz8ykvL2fTpk0AjBw5khkzZlBUVERJSQkTJkzgvvvuw2az8fzzz1NbW8u1115LfHz8aY2j34fo0JNFU1MT7e3txMfHEwgEePnllznvvPOYPXs2zc3NPPnkk0ybNo0bb7wROFojHap9vuqqq8IPYNI3Wltb+cEPfsC2bduorq5m6tSpDBs2jKysLJKTk/n9739Pfn4+X/7yl8nJyWHTpk3s27ePjRs3ctVVV6kNYR+JDGO7d++mvr6e2tpaMjIyGDVqFAAffvghVVVVDB06NLwiDYRXOiO/hvSN0N/GO++8w7Jly/j2t7/NtGnTaGpqYvXq1fj9flauXMnFF1+M2+0OB2m73U57ezvvvvsul19++Wk/ccjJbdq0idbWVtLT01m/fj0/+9nPSE9PZ/jw4cDR+RsyZAhpaWm89NJLeL1eJkyYQFxcHGPGjMFms6nNZx852dWCl156iSNHjnD++ed3CdLz58+noKAgXHbT0NDAu+++y1133aXFuj4SegzcsGEDXq833HUtNTWVIUOGcOjQIdatW0dcXBzDhw8nJyeHwsJChg4dyp49e3j++edZu3Yt3/nOd8jNzT3tcfTrEB16ct67dy8PPfQQ48ePJysri87OTp577jkuvvhiPB4PDzzwAJMmTeILX/gChmGwZMkSWlpayMvLo7i4WD02o6Cjo4PS0lIyMzPZuXMnu3btYsaMGaSlpVFVVcVbb73FDTfcQG5uLh0dHezevZubbrqJm266icTERAXoPhL6Pf/f//0fzz77bLhn9969e5k8eTIlJSV4vV42bdpEdXU1eXl54frn7l9Det+KFStYvHgxU6dOBWDnzp1kZmZyySWXsH79eh577DFuu+02rrjiCpYuXcrGjRuZNm0aCQkJ4a+xYcMGduzYwZVXXqkQ3QsaGxt5+umnefvtt5k4cSL5+fnU19ezcuVKEhMTw0HaZrPhcrlYu3YtW7duxW63M3bs2PDXUYDuG6d6teDcc8/FMIxwqU3k1YL4+HimTZtGVlZW1H6OwSDyimcwGKS8vJyf/vSntLe3M2TIEFJTU4Gjtep5eXmsWrWKnTt3AjB69GiA8B6RrVu38rWvfS3cEed09dsQHQrQZWVlPPTQQ1x22WVcccUVwNEHl9LSUpqbm3n66aeZMmUKn//858PHfi9ZsiTcgksbMqIjLi6Ow4cPs2XLFm6//XZWrFjB7t27mTFjBn6/n2XLlhEfH09+fj6LFi1i+/btfPrTnyY9PT3aQx8UIi+FrV27ljfffJOvfvWrXHLJJRQXF7N06VK2b98eft/r9bJy5UoSEhK6PNFL36msrOSRRx5h//79HDlyhAsuuICRI0eSk5NDIBDgT3/6E1dccQXXX389ycnJbNq0iYMHD3Lo0CFmzpxJMBiktbWVd999l3vuueeMVl/kxOLj48N9uZcuXcr555/PhRdeSGVlJUuXLiUpKSkcpH0+H83Nzdx5551cfPHFeq7qQz29WuDz+Rg/fjyGYVBUVHTM1YJQjbT0nsirnoZhkJqaSlZWFitXrqShoYGcnJzwC6HU1FQ++ugjWltbcTqd4bKc0NkUF1xwwWnXQUfqlyE69Ivav38/Dz74INdeey133nln+OOmadLU1MTzzz/PsGHDuP/++4mLiyMQCPDCCy+wceNG7r77blJTU/WgFAWhS8cjR45k27ZtZGdnc/7557No0SIOHDjAZZddFj5+c/ny5ZSVlfEv//Iv5OXlRXvog0bo7+Kjjz5i8+bNjBs3jksvvZTMzEwKCwspKSnhlVdeoampicmTJ1NcXEx6ejpXXnml/qaipKOjg7KyMkaMGMH27dvZuXMnM2bMIDExkbKyMlatWsVNN92Ex+OhoaGBsrIy7rvvPubMmRNeTHC5XEyePFkvVntJaKUsJycHj8fDgQMHWLZsGeeddx7Tpk2jqqqKxYsX4/f7MU2TBQsW4PV6ufHGG1XC0YdO92qBw+HQ1YIoWb58OY8//jjJycn4fL7wY1hRURGpRVD0AAAMnElEQVRJSUksX76cxsbGcJDu6Ohg+/btXHnllcyePfuYvTtnq269X4ZowzCora3lwQcfZPz48dx///3hjz3//PO8/vrr3H333dTX17NlyxYOHjzItm3bWLNmDX/729944IEH1IWjj1VVVfHBBx8wfPjw8AOL3+9nx44dNDQ0cMstt5CZmcnrr79OVVUV9957L+PGjeOcc87hlltuIT8/P8o/wcDX/VLYwYMHefjhh9mzZw8jRoxgwoQJ4Y9lZGTQ1tbGzp07mTZtGi6Xi8LCQrWxi6KEhATKysrYvn07c+fOZfny5ZSWljJjxgza29t57733sNlsJCUl8cwzz+D3+8PhLHLO9MTfeyJra7Ozs8nIyOgSpGfMmEFnZycLFy5kx44dGIbBAw88gN1u73JKqPQuXS2ILcFgkD//+c9UVlYSCARYvnw5hw8fxu12k5mZybBhw/B4POEr3vv27WPJkiXU1tZy1113hR8De+Pvq1+GaICWlhY+/PBDAoEAWVlZZGdns3DhQhYtWsTcuXPJy8vjvPPOw+l00tLSEt74dO+994aL/aVv1NTU8P3vf5/333+fHTt20NjYSHx8PJmZmRQUFDB//nwKCwuZOnUqWVlZvPbaa+zcuZMbbriB/Pz8LvWa0nuOdyksLy+PrVu30tjYyIgRI0hPT+9y2Mq+ffu44oorurxq15NI3wtd3Rk2bBgff/wxw4cPZ9KkSSxatIiDBw9y1VVXUVdXx5o1a3j33XdxuVz84Ac/wG63a+NnHztZkJ40aRIzZ87kkksuYerUqdx4443hk1s1R31DVwtij2EY2O12MjIymDNnDsXFxeFFhKVLl5Kbm8ukSZMYN24cBw4coKKigpSUlPAL1N58DOy3IToxMZHx48ezefNmtm3bxscff8zq1av5+te/zrnnnhv+hzxmzBguuOACLrnkkvChD9K3Wlpa2LZtGx6PB5vNhtPp5Omnn6a1tTW8Mtba2kpJSQk5OTmkp6ezdu1apk+frgDdR050KWzo0KFkZGTwwQcf0NjYSFpaGpmZmbS0tPDKK6/g8Xi0+hIlmzdv5oMPPmDkyJHhWr5gMMiGDRtoa2vjpptuCl/dqa6u5t5772X69OlMnjyZm2++ORzOVKvZ944XpA8ePMiyZcsYPXo0Q4cOJTU1NTynmqO+o6sFsSkQCDB//nxKSkqYOHEiV155JZmZmbz88suUlpayatUqCgoKmDBhArfeemv4qO/efgzstyEaICkpiTFjxrB582Y2bdrETTfdxGWXXQb8YzVMhzxEX2JiIiUlJezcuZPOzk5mzZrFrFmz2LZtGx988AHr1q2jvLycyy+/HLfbTUFBAVdeeWV4J630rk+6FFZYWEh6ejpLlixhzZo14Trp1tZWvv/974dfyetvrO9s27aNn//852zdupVdu3ZRXl5Owv9v725Dmmr/OIB/l7m1tZkM3abk4zQrRVRMnJWWGY0IJyUaWCGS2JtIMOhFRQVFGOGLnswXElhQBibeVFAaZEaoWbllReUsnY5ZmKHBzHy4X8T217v/fed6cGf5/bya2znzOhw953uu33XOJZNBrVYjKCgIV69ehVarRVxcHFQqFf766y88f/4cer0efn5+zmE3DGfu88+wplQq0dvbi6amJkRHRzuPf/y/mn2sFngepVKJ4eFhtLS0IDU1FQBw4sQJhISEwGAwwNvbG1VVVZicnMSKFSuc+/h37zNBh2gAUCgUiIqKQk9PDywWC/z9/aFWqxmeBUahUCA8PBwmkwnt7e1ISkqCXq9HfHw8xsfHsW7dOmi1WgBf72L29vZ2c4vnjpmUwuLi4rB06VLcv38fCxcuREpKCnbu3AkvLy+MjY0xjM2yiYkJdHd3Q6lUQiaTQaFQoLKyEoODg7Db7ZBKpc7ZCB1laYvFMq1qwGOj+/0zrPn6+sJsNmNgYAAxMTF8Hr4bsVrgecbGxtDR0YHIyEgcO3YMUqkUJSUlCAsLQ2xsLFJSUrB27dpZPQYKPkQDX3uko6KiYDQa0d7eDrVaDZVKxYOPwCgUCixZsgQmkwmtra3w9/dHWFgY4uPjOU7dzWZSCouMjIRcLkdXVxdEIpHzmdDsfZl9jmPeixcv8OnTJ+j1eqxfvx49PT1oaWmB0WjE4OAg1qxZA4lEgqCgIOfJg1UDYZka1tRqNV6+fAmr1Yr09HTuJzdjtcCzBAQEoLGx0TnZzd69eyGXywF87XhwPJFtNo+BHhGigf+dVJ49e4ampiYEBwfzweYC5NhPJpMJRqPRecFD7vW9Utj8+fNx4cIFxMTEIDk5GXfu3IHVakVwcDDvM3AThUIBrVYLo9GIR48eIT4+Hunp6UhOToZMJkNWVpZzbPvUXjKe8IVnaljr6OiA3W5HUlISp4cWAFYLPINjH/n4+KC7uxu5ubkIDg6eNtOkw2zuL48J0cDXgKbVatHd3Q2dTseZCAWKFzzC9L1SWHJyMnQ6HUJDQyGVStHW1oaMjAxIpVJ3N33OcgxnM5lMePjwIfz8/BASEoJly5Zh0aJF7HX2ICKRCENDQ7h+/Try8/N/yUQP9GuwWiB8jv0gk8lQX18PiUSC2NhYt+8fjwrRwNeTSlJSEhQKhbubQv+BFzzC871SmK+vL0QiEcbHx6HVapGamspeaAGYWt0xmUxQqVTO6o67TyDkGolEglWrVnGyGwFitcAzLFiwAGKxGNXV1UhMTHTOUOguHjnYkX/UniEwMBDFxcUcziEAk5OTAIDMzEwsXrwYBoMBcrnc+f7Ucc+O1+yBFg6NRoPCwkJIpVJUVFSgq6vL3U2iHyQWi93dBPoXjmqB2WxGXl4eJBKJu5tE/4fjJkIh3GslmnScRYnoj/fx40ccOHAAOp0OeXl57m4Ouaivrw/19fXOWbiI6NcbHR3lxY7AOaoG7p5MiiGaaI5paGhAZWUljh8/jtDQUHc3h36Qu08eRERzHY/ARHOMkEph9OMYoImI3Is90URzkFBKYURERJ6KIZqIiIiIyEXsgiIiIiIichFDNBERERGRixiiiYiIiIhcxBBNREREROQihmgiIiIiIhcxRBMRERERuYghmojoD3f27FmcOnVqxssfPnwYV65c+anfmZOTA5PJ9FPfQUQkZAzRREREREQuYogmIiIiInLRfHc3gIiIZu7Dhw8oKSlBfn4+0tLSAAA3btxAXV0dysrKIJfLv/sdtbW1uHfvHt6/fw+lUgm9Xo+NGzdOW2Z0dBRnzpxBS0sLFAoFtm3bhpSUFOfnXV1dqKqqwuvXr+Hr64u0tDRs2bIFXl5ev3aDiYgEiiGaiMiDKJVKFBQUoLKyEjExMfj8+TMuX76M4uLiGQVoAPD29kZRURGUSiU6OztRXl4OjUaDhIQE5zINDQ3IzMxEaWkpmpubcfr0aYSHh0Oj0WB4eBhHjx6FwWDArl27MDAwgIqKCojFYmRlZf2uTSciEhSGaCIiD7N69Wq0traivLwcdrsdKSkpSExMnPH6mzZtcr5WqVTo6OhAc3PztBAdFBSE7OxsAMDmzZvx5MkT3L59Gzt27MCtW7cQHR0Ng8EAANBoNMjJyUF1dTVDNBHNGQzRREQeqLCwEHv27IFYLMb+/ftdWvfx48eora2FzWbDyMgIxsbGsHz58mnLaLXaaT9HRETAarUCAHp6etDW1obt27c7P5+YmMD4+DgmJiYwbx5vtyGiPx9DNBGRB7JYLM4APDQ0BJlMNqP1+vv7cfLkSRgMBuTn50Mmk6Gurg42m23aciKR6F+/Y2RkBCtXrnT2VE/FAE1EcwVDNBGRhxkZGcG5c+eQnZ2Nvr4+lJeX49ChQzMKsG/evIFYLEZubq7zvXfv3n2zXGdn57SfzWYzIiIiAAAhISF4+vQpNBrNT24JEZHnYpcBEZGHqaqqgo+PD7KyslBQUACbzYabN2/OaF21Wg273Y67d+/CZrOhpqYGZrP5m+UsFguuXbsGq9WK2tpavHr1CuvXrwcAbNiwAf39/Th//jzevn0Lq9WKBw8eoKam5pduJxGRkLEnmojIgxiNRjQ2NqK0tBReXl6Qy+UoKipCWVkZEhISEBgY+J/rh4WFYevWrbh06RK+fPkCnU6HjIyMb4J0RkYGent7sW/fPsjlcuzevRsBAQEAAD8/Pxw5cgQXL17EwYMHMW/ePAQGBkKv1/+27SYiEhrR5OTkpLsbQURERETkSTicg4iIiIjIRQzRREREREQuYogmIiIiInIRQzQRERERkYsYoomIiIiIXMQQTURERETkIoZoIiIiIiIXMUQTEREREbmIIZqIiIiIyEV/A4rH/n2Cs2vZAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 832x572 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "from matplotlib.ticker import FuncFormatter\n",
    "fig,ax=plt.subplots()\n",
    "ax.plot(x,y,'c-')\n",
    "\n",
    "#set函数可以直接按名设置图像的各个Artist对象\n",
    "ax.set(xlim=[2,8],ylim=[0,3],title='custom plot',xlabel='x label',ylabel='y label')\n",
    "\n",
    "#对具体的某个Artist对象的属性，需要先通过Axes对象获取该对象，然后通过plt.setp方法设置其属性\n",
    "labels=ax.get_xticklabels()\n",
    "\n",
    "#plt.setp函数可以同时设置某个matplotlib对象的多个属性\n",
    "plt.setp(labels,rotation=45,horizontalalignment='right')\n",
    "\n",
    "#使用Axes对象下的xaxis对象可以设置大小刻度的标签格式器\n",
    "def month(x,pos):\n",
    "    m=np.floor(x)\n",
    "    return 'Jan' if m==1 else 'Feb' if m==2 else 'Mar' if m==3 else 'April' if m==4 else 'May' if m==5\\\n",
    "else 'Jun' if m==6 else 'July' if m==7 else 'Aug' if m==8 else 'Sep' if m==9 else 'Oct' if m==10 else 'Nov' if m==11 else 'Dec'\n",
    "\n",
    "formatter=FuncFormatter(month)\n",
    "ax.xaxis.set_major_formatter(formatter)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "4. 多视图组合"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 96,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.lines.Line2D at 0x2ae9392b588>"
      ]
     },
     "execution_count": 96,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 640x320 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import pandas as pd\n",
    "df=pd.DataFrame(data=[['Samsung','Apple','Huawei','Xiaomi','Oppo','Other'],[292.3,208.8,206,122.6,113.1,462]])\n",
    "df=df.transpose()\n",
    "df.columns=['Company','Shipment']\n",
    "df['Share']=df.apply(lambda x:x[1]/df['Shipment'].sum(),axis=1)\n",
    "\n",
    "fig,ax=plt.subplots(figsize=(8,4))\n",
    "ax.axvspan(100,300)\n",
    "ax.barh(df['Company'],df['Shipment'])\n",
    "ax.set_xlabel('shipment/million devices')\n",
    "ax.set_title('Shipment volumes of mobil phone company in 2018')\n",
    "ax.axvline(df['Shipment'].mean())"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "> 可以看出先画的图在下方，即为叠加绘图"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "5. 保存图  \n",
    "使用`fig.savefig`即可，欲了解支持的保存图片格式，可使用`print(fig.canvas.get_supported_filetypes())`"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 97,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{'ps': 'Postscript', 'eps': 'Encapsulated Postscript', 'pdf': 'Portable Document Format', 'pgf': 'PGF code for LaTeX', 'png': 'Portable Network Graphics', 'raw': 'Raw RGBA bitmap', 'rgba': 'Raw RGBA bitmap', 'svg': 'Scalable Vector Graphics', 'svgz': 'Scalable Vector Graphics', 'jpg': 'Joint Photographic Experts Group', 'jpeg': 'Joint Photographic Experts Group', 'tif': 'Tagged Image File Format', 'tiff': 'Tagged Image File Format'}\n"
     ]
    }
   ],
   "source": [
    "print(fig.canvas.get_supported_filetypes())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 98,
   "metadata": {},
   "outputs": [],
   "source": [
    "fig.savefig('test1.jpg')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 使用样式表和`rcParams`"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "个人认为使用以上提供的方法已能够改变绝大多数自定义属性了，使用样式表和rcParam大概只是为了设置`matplotlib`环境下的默认绘图属性。个人认为这是在写完备软件或者每次绘图样式都一样时将其设为默认，对于数据处理的交互式绘图其实没必要，毕竟没有人会在每次绘图时都打开配置文件去修改，故不做深入解释，参考[Customizing Matplotlib with style sheets and rcParams](https://matplotlib.org/tutorials/introductory/customizing.html)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 中级"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### `Artist`教程  \n",
    "所有的图像中的艺术元素都是`Artist`对象（比如标题、xy标签、xy刻度、图线、文本等），如上所述，`matplotlib`中有三个层次的API，  \n",
    "- matplotlib.backend_bases.FigureCanvas是图像绘制的区域\n",
    "- matplotlib.backend_bases.Renderer是知道如何在FigureCanvas上绘制的对象\n",
    "- matplotlib.artist.Artist是知道如何使用renderer向canvas绘图的对象  \n",
    "  \n",
    "前两个处理底层或者说后端的绘图细节，用户95%时间都是与`Artist`打交道，无需关心前两层API。`Artist`对象中有两类——原始类型(primitives)与容器类型(containers)，原始类型是直接绘制到画布上的对象，如`Line2D`，`Rectangle`，`Text`，`AxesImage`等，容器类型是用来放置原始类型对象的地方，如`Axes`，`Axis`，`Figure`。常规做法是先生成`Figure`类对象(比如使用`plt.figure()`生成)，再用生成的`Figure`类对象生成`Axes`对象（比如`fig.add_subplot()`或者`fig.add_axes()`），之后再由`Axes`对象生成原始类型对象(比如`Axes.plot()`函数可生成`Line2D`对象)；`Axes`可能是`matplotlib`中最重要的类，大部分原始类型对象都是放在`Axes`下的列表中，比如Axes.lines列表包含了所有该坐标轴下添加的`Line2D`对象，大部分`pylot`中的绘图函数也是对`Axes`的成员方法的封装，比如`plt.plot()`与`Axes.plot()`、`plt.xlabel()`与`Axes.set_xlabel()`等等。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 134,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Text(0.5, 0, 'time/s')"
      ]
     },
     "execution_count": 134,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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mpoa9I1HosE3fddo+PDh3PTLT88++6zef/99VVdXKzY21nfzoOzs7JB+aTGaFBUVacuWLUG/hinKAQAAAIPxJxEAAABgMIpyAAAAwGAU5QAAAIDBKMoBAAAAg1GUAwAAAAajKAcAAAAMRlEOAAAAGIyiHAAAADAYRTkARKmioiLNnDnT6DAAAOKOngAQNWbOnKlLL73Ud6vy+vp6ud1uderUqc33vWnTJr311luaMWNGm+8LAMKRxegAAADGiI+Pb7d9bdu2TZdffnm77Q8Awg1FOQBEgQULFqi0tFSlpaUqLi5Wamqqhg8fro8++kizZ8+WJM2aNUsXXXSRjh8/rn/961/q3LmzfvrTn+qCCy7QwoULtWvXLvXp00f33HOPUlNTfX3/7W9/09/+9jfV1NTo/PPP1/jx4zVo0CDf791utz766CONHz9ekrR27Vr97W9/k9PpVJcuXZSVleWbvQeAaEVRDgBR4Cc/+YkOHTqkAQMGaMyYMYqJidHf//7309pt3LhR48aN0w033KC1a9eqsLBQF110ka677jrdfvvtevzxx7V48WL9v//3/yQ1LUtZt26dfvazn6lHjx7atm2bHn74Yf3+979XWlqaJGnnzp1KSUnReeedp7KyMhUVFennP/+5evfurS+++ELl5eXtmgsA6Ij4oicARIHExESZzWbFx8crOTlZXbp0OWO7AQMG6LrrrlOPHj2Um5urY8eO6dJLL9UVV1yhXr166dprr9XOnTt97V9++WXddtttyszMVPfu3XXttddqwIABeuONN3xtTl26UlVVpeTkZF166aWy2+3KyMjQsGHD2vbgASAMMFMOAPA5//zzff/ftWvXM247duyYPB6PTp48qYqKCv3f//1fiz7cbrdSUlJ8j7dt26aJEydKkgYPHqxly5bp7rvvVmZmpq688kpdfvnlMplMbXlYANDhUZQDAHwslq8+FpoLZbPZfNo2r9er+vp6SdI999zTonCXvvoS6eHDh1VbW6sBAwZIapqxf+yxx7R9+3aVlJTo8ccfl8Ph0C9/+cu2OygACAMU5QAQJSwWizweT8j669q1q5KTk1VVVaWhQ4eesc22bdt02WWXtSjsLRaLhgwZoiFDhmjYsGH61a9+paNHj/pm5gEgGlGUA0CUsNvt2r17t6qrqxUbGxt0fyaTSTfeeKOWL1+u+Ph4XXzxxTp+/Lg++ugjORwOXXLJJXr//fc1YsQI33Pef/99VVZWauDAgYqLi/Nd5aVz585BxwMA4YyiHACixOjRo7VgwQJNnTpVNptNw4cPD7rPa6+9VlarVatWrdKf//xnde7cWf3799e3vvUtnThxQrt27dLPf/5zX/ukpCStWrVKy5YtU2Njoy688EJNnz5dMTFcdwBAdOOOngCANvHWW29pzZo1+u1vf2t0KADQ4TE1AQBoE4mJiRo7dqzRYQBAWGCmHAAAADAYM+UAAACAwSjKAQAAAINRlAMAAAAGoygHAAAADEZRDgAAABiMohwAAAAwGEU5AAAAYLD/D+0OGYKcsok3AAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 832x572 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig=plt.figure()\n",
    "ax=fig.add_subplot(2,1,1)\n",
    "ax2=fig.add_subplot(2,1,2)\n",
    "t=np.arange(0.0,1.0,0.01)\n",
    "s=np.sin(2*np.pi*t)\n",
    "line,=ax.plot(t,s,'b',lw=2)#`line,`表示解包，因为ax.plot()函数返回的是一个列表，解包了之后line是该列表中的第一个元素\n",
    "#以下方法可以删除画出的线，可见plot()函数其实是把Axes对象下的lines列表更新了，添加了一个Line2D对象而已\n",
    "#del ax.lines[0]\n",
    "#ax.lines.remove(line)\n",
    "ax.set_ylabel('volts')\n",
    "ax.set_title('a sine wave')\n",
    "ax2.hist(np.random.randn(1000),50,facecolor='yellow',edgecolor='blue')\n",
    "ax2.set_xlabel('time/s')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "所有的`Artist`对象都有`patch`成员变量，patch表示该`Artist`绘制的一些基本属性（区域——或矩形或圆形或多边形等、透明度、可见性、文本标签等等），参考[定制对象属性](https://matplotlib.org/tutorials/intermediate/artists.html#customizing-your-objects)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 136,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "    agg_filter = None\n",
      "    alpha = None\n",
      "    animated = False\n",
      "    antialiased = False\n",
      "    bbox = Bbox(x0=0.0, y0=0.0, x1=1.0, y1=1.0)\n",
      "    capstyle = butt\n",
      "    children = []\n",
      "    clip_box = None\n",
      "    clip_on = True\n",
      "    clip_path = None\n",
      "    contains = None\n",
      "    data_transform = BboxTransformTo(     TransformedBbox(         Bbox...\n",
      "    edgecolor = (0.5, 0.5, 0.5, 1.0)\n",
      "    extents = Bbox(x0=0.0, y0=0.0, x1=832.0, y1=572.0)\n",
      "    facecolor = (1.0, 1.0, 1.0, 1.0)\n",
      "    figure = Figure(832x572)\n",
      "    fill = True\n",
      "    gid = None\n",
      "    hatch = None\n",
      "    height = 1\n",
      "    in_layout = True\n",
      "    joinstyle = miter\n",
      "    label = \n",
      "    linestyle = solid\n",
      "    linewidth = 0.0\n",
      "    patch_transform = CompositeGenericTransform(     BboxTransformTo(   ...\n",
      "    path = Path(array([[0., 0.],        [1., 0.],        [1.,...\n",
      "    path_effects = []\n",
      "    picker = None\n",
      "    rasterized = None\n",
      "    sketch_params = None\n",
      "    snap = None\n",
      "    transform = CompositeGenericTransform(     CompositeGenericTra...\n",
      "    transformed_clip_path_and_affine = (None, None)\n",
      "    url = None\n",
      "    verts = [[  0.   0.]  [832.   0.]  [832. 572.]  [  0. 572....\n",
      "    visible = True\n",
      "    width = 1\n",
      "    window_extent = Bbox(x0=0.0, y0=0.0, x1=832.0, y1=572.0)\n",
      "    x = 0\n",
      "    xy = (0, 0)\n",
      "    y = 0\n",
      "    zorder = 1\n"
     ]
    }
   ],
   "source": [
    "import matplotlib as mpl\n",
    "mpl.artist.getp(fig.patch)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "对象容器——  \n",
    "`matplotlib`中容器等级为：  \n",
    "```cmd\n",
    "Figure-\n",
    "    Axes-\n",
    "        Axis-\n",
    "            Tick\n",
    "```  \n",
    "`Axes`类中有许多帮助函数，用于绘图（其实就是生成对应的`Artist`对象并保存在`Axes`对应的列表中），包括  \n",
    "\n",
    "|函数|作用|添加的Artist对象|列表容器|\n",
    "| ---- | ------------- | --------------- | ----------- |\n",
    "|ax.annotate|添加注释|Annotate|ax.texts|\n",
    "|ax.bar|绘制柱状图|Rectangle|ax.patches|\n",
    "|ax.errorbar|误差柱状图|Line2D和Rectangle|ax.lines和ax.patches|\n",
    "|ax.fill|填充多边形|Polygon|ax.patches|\n",
    "|ax.hist|直方图|Rectangle|ax.patches|\n",
    "|ax.imshow|显示图片|Axesimage|ax.images|\n",
    "|ax.legend|图例|Legend|ax.lengends|\n",
    "|ax.plot|x y数据绘制|Line2D|ax.lines|\n",
    "|ax.scatter|离散点绘制|PolygonCollection|ax.collections|\n",
    "|ax.text|绘制文本|Text|ax.texts|  \n",
    "\n",
    "更多的`Figure`、`Axes`、`Axis`、`Tick`属性可以参考[Object containers](https://matplotlib.org/tutorials/intermediate/artists.html#object-containers)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "> 中级教程的剩余部分包括图例、多图绘制的布局及其布局限制以及高级教程部分就不一一列出了，更多的也不过是一些细节及高级用法的记忆，可以在使用过程中逐步了解与记忆。[matplotlib教程链接](https://matplotlib.org/tutorials/index.html)。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Pandas教程"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 数据结构介绍"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "pandas的主要数据结构是带有标签的一维序列`Series`和二维数据`DataFrame`，类似于numpy中的一维、二维数组，事实上numpy中的很多使用`ndarray`作为输入的函数都可以无障碍地使用pandas中的数据结构，且行为如预期无二致。pandas的数据结构与一般的序列或多维数组最大的不同是数据**自动对齐功能**。所谓的数据自动对齐功能是指，如果两个`Series`相加，会把`Series`里对应index的数据相加而不管其真实的顺序；两个`DataFrame`相加会把对应index、对应column的数据相加也不管其真实的顺序。index、column相当于“行号”、“列号”。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### `Series`  \n",
    "1.`Series`生成——`Series(data,index)`  \n",
    "\n",
    "`Series`的index（注：index可以不给出）就如同字典的键，如果把`Series`看做列向量，index就如同“行号”,如同行的名称。\n",
    "- 由python字典生成。如果没指定index则使用字典的键值作为index，如果指定了index，则相当于把`Series`中对应index的元素设为字典中对应该键的元素——如果字典中不存在该键，则使用numpy.nan类型表示无意义缺失数据（pandas中缺失数据的统一表示方式）；如果字典中有的键不在index中，则该键对应的值不取\n",
    "- 由ndarray生成。如果不指定index则自动生成一个`range(data.size)`作为index；如果指定index，则index列表的长度必须与ndarray数据size相符\n",
    "- 由一个数生成。指定index则把各个index对应的元素设为该数；不指定则生成一个长度为1的`Series`"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "b    1\n",
      "c    3\n",
      "a    0\n",
      "dtype: int64\n",
      "b    1.0\n",
      "c    3.0\n",
      "d    NaN\n",
      "dtype: float64\n"
     ]
    }
   ],
   "source": [
    "import pandas as pd\n",
    "import numpy as np\n",
    "d={'b':1,'c':3,'a':0}\n",
    "s1=pd.Series(d)\n",
    "s11=pd.Series(d,index=['b','c','d'])\n",
    "print(s1)\n",
    "print(s11)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 189,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0    0.306600\n",
      "1    0.623135\n",
      "2    0.708642\n",
      "3    0.553359\n",
      "4    0.831509\n",
      "dtype: float64\n",
      "row1    0.138651\n",
      "row2    0.512370\n",
      "row3    0.790319\n",
      "row4    0.457625\n",
      "row5    0.514766\n",
      "dtype: float64\n"
     ]
    }
   ],
   "source": [
    "s2=pd.Series(np.random.rand(5))\n",
    "s22=pd.Series(np.random.rand(5),index=['row1','row2','row3','row4','row5'])\n",
    "print(s2)\n",
    "print(s22)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 155,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "a    5\n",
      "b    5\n",
      "c    5\n",
      "d    5\n",
      "e    5\n",
      "dtype: int64\n",
      "0    4\n",
      "dtype: int64\n"
     ]
    }
   ],
   "source": [
    "s3=pd.Series(5,index=['a','b','c','d','e'])\n",
    "s33=pd.Series(4)\n",
    "print(s3)\n",
    "print(s33)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "2. `Series`索引与切片  \n",
    "`Series`既类似于`ndarray`，又类似与字典——既可以进行`ndarray`式的序号切片或者布尔值索引切片（切片的时候index一起切），而且大部分numpy的函数也可以使用`Series`做参数；又可以使用字典式的键值索引："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 190,
   "metadata": {},
   "outputs": [],
   "source": [
    "s2.index=['a','b','c','d','e']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 191,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.7086422105658101"
      ]
     },
     "execution_count": 191,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "s2[2]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 192,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "a    0.306600\n",
       "b    0.623135\n",
       "c    0.708642\n",
       "d    0.553359\n",
       "dtype: float64"
      ]
     },
     "execution_count": 192,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "s2[:-1]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 193,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "b    0.623135\n",
       "c    0.708642\n",
       "d    0.553359\n",
       "e    0.831509\n",
       "dtype: float64"
      ]
     },
     "execution_count": 193,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "s2[1:]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 194,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "e    0.831509\n",
       "d    0.553359\n",
       "b    0.623135\n",
       "dtype: float64"
      ]
     },
     "execution_count": 194,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "s2[[4,3,1]]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 195,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "c    0.708642\n",
       "e    0.831509\n",
       "dtype: float64"
      ]
     },
     "execution_count": 195,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "s2[s2>s2.median()]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 196,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "a    1.358797\n",
       "b    1.864765\n",
       "c    2.031231\n",
       "d    1.739085\n",
       "e    2.296781\n",
       "dtype: float64"
      ]
     },
     "execution_count": 196,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.exp(s2)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "3. 名称属性  \n",
    "`Series`有`name`属性，即可给`Series`命名，其实`Series`相当于`DataFrame`里的列，给其命名相当于给定“列号”/列的名称"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 176,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "something\n",
      "False\n"
     ]
    }
   ],
   "source": [
    "s1.name='something'\n",
    "s11=s1.rename('another thing')#重命名生成了一个改变了名字的Series,原来的Series并不变\n",
    "print(s1.name)\n",
    "print(s1 is s11)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "4. 向量化操作与数据对齐  \n",
    "一般的按位运算以及numpy中的数学函数等行为与numpy的`ndarray`一样；但是因为`Series`有自动对齐功能，所以这里的按位并不是按照序号相同的元素进行相应操作，而是按照index相同的元素进行按位操作——这样可以无需考虑两个按位运算的`Series`是否元素数一样，因为会自动对齐，比如：  \n",
    "```python\n",
    ">>>s1\n",
    "a   1.0\n",
    "b   2.0\n",
    "c   3.0\n",
    "d   4.0\n",
    "dtype:float64\n",
    ">>>s2\n",
    "c   3.5\n",
    "d   2.4\n",
    "e   5.2\n",
    "stype:float64\n",
    "```  \n",
    "这样两个`Series`，其index不一致，如果计算`s1+s2`时，会先自动对齐，s1缺index e，s2缺index a,b，会自定补齐为:  \n",
    "```cmd\n",
    "     s1            s2\n",
    "a   1.0        a   NaN\n",
    "b   2.0        b   NaN\n",
    "c   3.0        c   3.5\n",
    "d   4.0        d   2.4\n",
    "e   NaN        e   5.2\n",
    "```  \n",
    "所以  \n",
    "```python\n",
    ">>>s1+s2\n",
    "a   NaN\n",
    "b   NaN\n",
    "c   6.5\n",
    "d   6.4\n",
    "e   NaN\n",
    "```  \n",
    "基于`Series`的自动对齐功能，其按位运算其实是按index位运算，两个`Series`相加行数等于两个`Series`中行名称不同的行数，结果的各行数据为加数的对应行数据之和，这使得错位加法与numpy中结果不同，如下："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 177,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "a    0.143963\n",
       "b    0.928369\n",
       "c    0.817016\n",
       "d    0.967723\n",
       "e    0.161322\n",
       "dtype: float64"
      ]
     },
     "execution_count": 177,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "s=pd.Series(np.random.rand(5),index=['a','b','c','d','e'])\n",
    "s"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 179,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "a    0.287927\n",
       "b    1.856737\n",
       "c    1.634033\n",
       "d    1.935446\n",
       "e    0.322645\n",
       "dtype: float64"
      ]
     },
     "execution_count": 179,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "s+s"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 180,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "a    0.020725\n",
       "b    0.861868\n",
       "c    0.667516\n",
       "d    0.936488\n",
       "e    0.026025\n",
       "dtype: float64"
      ]
     },
     "execution_count": 180,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "s**2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 181,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "a    0.143466\n",
       "b    0.800644\n",
       "c    0.729107\n",
       "d    0.823597\n",
       "e    0.160624\n",
       "dtype: float64"
      ]
     },
     "execution_count": 181,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.sin(s)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 183,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "a         NaN\n",
       "b    1.856737\n",
       "c    1.634033\n",
       "d    1.935446\n",
       "e         NaN\n",
       "dtype: float64"
      ]
     },
     "execution_count": 183,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "s[:-1]+s[1:]#数据自动对齐"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### `DataFrame`  "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### `DataFrame`生成——pd.DataFrame(data,index,columns)  \n",
    "\n",
    "index与column相当于行名称、列名称（生成时可以不给定）,data的类型可以是：  \n",
    "- 字典。字典的键是列名称，字典的元素可以是`Series`，也可以是字典（先转化成`Series`），也可以是`ndarray`或者列表（要求`ndarray`/列表的长度一致）；字典的值还可以是元组，这是创建MultiIndexed frame的方法，不常见也更复杂。\n",
    "- `Series`。单列的数据表。\n",
    "- 列表。列表的元素可以是字典（注意这里每个字典对应一行数据，而不是一列了；缺失列为NaN）;也可以是`Series`，同样一个`Series`表示一行，很有可能字典在这里也是先转化成`Series`；还可以是列表，这样行列名称都是自动编号\n",
    "- 二维`ndarray`。就像二维列表一样，不给定index与columns参数行列自动编号"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>col1</th>\n",
       "      <th>col2</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>a</th>\n",
       "      <td>1</td>\n",
       "      <td>1.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>b</th>\n",
       "      <td>2</td>\n",
       "      <td>2.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>c</th>\n",
       "      <td>3</td>\n",
       "      <td>3.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>d</th>\n",
       "      <td>4</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   col1  col2\n",
       "a     1   1.0\n",
       "b     2   2.0\n",
       "c     3   3.0\n",
       "d     4   NaN"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "d={'col1':pd.Series([1,2,3,4],index=['a','b','c','d']),\n",
    "   'col2':pd.Series([1,2,3],index=['a','b','c'])}\n",
    "df=pd.DataFrame(d)\n",
    "df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>col1</th>\n",
       "      <th>col2</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>d</th>\n",
       "      <td>4</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>b</th>\n",
       "      <td>2</td>\n",
       "      <td>2.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>a</th>\n",
       "      <td>1</td>\n",
       "      <td>1.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   col1  col2\n",
       "d     4   NaN\n",
       "b     2   2.0\n",
       "a     1   1.0"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pd.DataFrame(d,index=['d','b','a'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>col1</th>\n",
       "      <th>col2</th>\n",
       "      <th>col3</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>d</th>\n",
       "      <td>4</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>b</th>\n",
       "      <td>2</td>\n",
       "      <td>2.0</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>a</th>\n",
       "      <td>1</td>\n",
       "      <td>1.0</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   col1  col2 col3\n",
       "d     4   NaN  NaN\n",
       "b     2   2.0  NaN\n",
       "a     1   1.0  NaN"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pd.DataFrame(d,index=['d','b','a'],columns=['col1','col2','col3'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Index(['a', 'b', 'c', 'd'], dtype='object')"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.index"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Index(['col1', 'col2'], dtype='object')"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.columns"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>col1</th>\n",
       "      <th>col2</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>4</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   col1  col2\n",
       "0     1     4\n",
       "1     2     3\n",
       "2     3     2\n",
       "3     4     1"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#字典的值是列表时列表的尺寸必须一致了，因为这里是生成默认的index，无法知道哪个index对应的数据不存在\n",
    "d={'col1':[1,2,3,4],'col2':[4,3,2,1]}\n",
    "df=pd.DataFrame(d)\n",
    "df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>col1</th>\n",
       "      <th>col2</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>a</th>\n",
       "      <td>1</td>\n",
       "      <td>4</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>b</th>\n",
       "      <td>2</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>c</th>\n",
       "      <td>3</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>d</th>\n",
       "      <td>4</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   col1  col2\n",
       "a     1     4\n",
       "b     2     3\n",
       "c     3     2\n",
       "d     4     1"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pd.DataFrame(d,index=['a','b','c','d'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>col2</th>\n",
       "      <th>col3</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>4</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>3</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>2</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   col2 col3\n",
       "0     4  NaN\n",
       "1     3  NaN\n",
       "2     2  NaN\n",
       "3     1  NaN"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pd.DataFrame(d,columns=['col2','col3'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>one</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   one\n",
       "0    1\n",
       "1    2\n",
       "2    3\n",
       "3    4\n",
       "4    5"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "s1=pd.Series([1,2,3,4,5])\n",
    "s1.name='one'\n",
    "pd.DataFrame(s1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>0</th>\n",
       "      <th>1</th>\n",
       "      <th>2</th>\n",
       "      <th>3</th>\n",
       "      <th>4</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>one</th>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>3</td>\n",
       "      <td>4</td>\n",
       "      <td>5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>two</th>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>3</td>\n",
       "      <td>4</td>\n",
       "      <td>5</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     0  1  2  3  4\n",
       "one  1  2  3  4  5\n",
       "two  1  2  3  4  5"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "s2=s1.rename('two')\n",
    "pd.DataFrame([s1,s2])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>a</th>\n",
       "      <th>b</th>\n",
       "      <th>c</th>\n",
       "      <th>d</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>3</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>NaN</td>\n",
       "      <td>4.0</td>\n",
       "      <td>7</td>\n",
       "      <td>9.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>6.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>3</td>\n",
       "      <td>5.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     a    b  c    d\n",
       "0  1.0  2.0  3  NaN\n",
       "1  NaN  4.0  7  9.0\n",
       "2  6.0  NaN  3  5.0"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data=[{'a':1,'b':2,'c':3},{'b':4,'c':7,'d':9},{'a':6,'c':3,'d':5}]\n",
    "pd.DataFrame(data)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>0</th>\n",
       "      <th>1</th>\n",
       "      <th>2</th>\n",
       "      <th>3</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>3</td>\n",
       "      <td>4</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>5</td>\n",
       "      <td>6</td>\n",
       "      <td>7</td>\n",
       "      <td>8</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>9</td>\n",
       "      <td>8</td>\n",
       "      <td>7</td>\n",
       "      <td>6</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   0  1  2  3\n",
       "0  1  2  3  4\n",
       "1  5  6  7  8\n",
       "2  9  8  7  6"
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data=[[1,2,3,4],[5,6,7,8],[9,8,7,6]]\n",
    "pd.DataFrame(data)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>0</th>\n",
       "      <th>1</th>\n",
       "      <th>2</th>\n",
       "      <th>3</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0.192573</td>\n",
       "      <td>0.730975</td>\n",
       "      <td>0.841481</td>\n",
       "      <td>0.931627</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>0.293800</td>\n",
       "      <td>0.053102</td>\n",
       "      <td>0.338191</td>\n",
       "      <td>0.020721</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>0.317729</td>\n",
       "      <td>0.235391</td>\n",
       "      <td>0.718062</td>\n",
       "      <td>0.087604</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "          0         1         2         3\n",
       "1  0.192573  0.730975  0.841481  0.931627\n",
       "2  0.293800  0.053102  0.338191  0.020721\n",
       "3  0.317729  0.235391  0.718062  0.087604"
      ]
     },
     "execution_count": 24,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pd.DataFrame(np.random.rand(3,4),index=[1,2,3])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 列选中、插入、删除  \n",
    "基本与字典的操作一，通过键索引列，得到的列是一个`Series`；添加、删除操作与字典也类似"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 55,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>one</th>\n",
       "      <th>two</th>\n",
       "      <th>three</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>a</th>\n",
       "      <td>0.081774</td>\n",
       "      <td>0.689690</td>\n",
       "      <td>0.137227</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>b</th>\n",
       "      <td>0.191447</td>\n",
       "      <td>0.185544</td>\n",
       "      <td>0.306146</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>c</th>\n",
       "      <td>0.954003</td>\n",
       "      <td>0.415900</td>\n",
       "      <td>0.434817</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>d</th>\n",
       "      <td>0.290428</td>\n",
       "      <td>0.441525</td>\n",
       "      <td>0.778144</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "        one       two     three\n",
       "a  0.081774  0.689690  0.137227\n",
       "b  0.191447  0.185544  0.306146\n",
       "c  0.954003  0.415900  0.434817\n",
       "d  0.290428  0.441525  0.778144"
      ]
     },
     "execution_count": 55,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data=np.random.rand(4,3)\n",
    "df=pd.DataFrame(data,index=['a','b','c','d'],columns=['one','two','three'])\n",
    "df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 56,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(a    0.137227\n",
       " b    0.306146\n",
       " c    0.434817\n",
       " d    0.778144\n",
       " Name: three, dtype: float64, pandas.core.series.Series)"
      ]
     },
     "execution_count": 56,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df['three'],type(df['three'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 57,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>one</th>\n",
       "      <th>two</th>\n",
       "      <th>three</th>\n",
       "      <th>four</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>a</th>\n",
       "      <td>0.081774</td>\n",
       "      <td>0.689690</td>\n",
       "      <td>0.137227</td>\n",
       "      <td>0.771464</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>b</th>\n",
       "      <td>0.191447</td>\n",
       "      <td>0.185544</td>\n",
       "      <td>0.306146</td>\n",
       "      <td>0.376992</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>c</th>\n",
       "      <td>0.954003</td>\n",
       "      <td>0.415900</td>\n",
       "      <td>0.434817</td>\n",
       "      <td>1.369902</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>d</th>\n",
       "      <td>0.290428</td>\n",
       "      <td>0.441525</td>\n",
       "      <td>0.778144</td>\n",
       "      <td>0.731953</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "        one       two     three      four\n",
       "a  0.081774  0.689690  0.137227  0.771464\n",
       "b  0.191447  0.185544  0.306146  0.376992\n",
       "c  0.954003  0.415900  0.434817  1.369902\n",
       "d  0.290428  0.441525  0.778144  0.731953"
      ]
     },
     "execution_count": 57,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df['four']=df['one']+df['two']\n",
    "df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 58,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>one</th>\n",
       "      <th>two</th>\n",
       "      <th>three</th>\n",
       "      <th>four</th>\n",
       "      <th>flag</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>a</th>\n",
       "      <td>0.081774</td>\n",
       "      <td>0.689690</td>\n",
       "      <td>0.137227</td>\n",
       "      <td>0.771464</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>b</th>\n",
       "      <td>0.191447</td>\n",
       "      <td>0.185544</td>\n",
       "      <td>0.306146</td>\n",
       "      <td>0.376992</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>c</th>\n",
       "      <td>0.954003</td>\n",
       "      <td>0.415900</td>\n",
       "      <td>0.434817</td>\n",
       "      <td>1.369902</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>d</th>\n",
       "      <td>0.290428</td>\n",
       "      <td>0.441525</td>\n",
       "      <td>0.778144</td>\n",
       "      <td>0.731953</td>\n",
       "      <td>True</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "        one       two     three      four   flag\n",
       "a  0.081774  0.689690  0.137227  0.771464  False\n",
       "b  0.191447  0.185544  0.306146  0.376992  False\n",
       "c  0.954003  0.415900  0.434817  1.369902  False\n",
       "d  0.290428  0.441525  0.778144  0.731953   True"
      ]
     },
     "execution_count": 58,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df['flag']=df['three']>0.5\n",
    "df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 59,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>one</th>\n",
       "      <th>oneandhalf</th>\n",
       "      <th>two</th>\n",
       "      <th>three</th>\n",
       "      <th>four</th>\n",
       "      <th>flag</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>a</th>\n",
       "      <td>0.081774</td>\n",
       "      <td>0.081774</td>\n",
       "      <td>0.689690</td>\n",
       "      <td>0.137227</td>\n",
       "      <td>0.771464</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>b</th>\n",
       "      <td>0.191447</td>\n",
       "      <td>0.191447</td>\n",
       "      <td>0.185544</td>\n",
       "      <td>0.306146</td>\n",
       "      <td>0.376992</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>c</th>\n",
       "      <td>0.954003</td>\n",
       "      <td>0.954003</td>\n",
       "      <td>0.415900</td>\n",
       "      <td>0.434817</td>\n",
       "      <td>1.369902</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>d</th>\n",
       "      <td>0.290428</td>\n",
       "      <td>0.290428</td>\n",
       "      <td>0.441525</td>\n",
       "      <td>0.778144</td>\n",
       "      <td>0.731953</td>\n",
       "      <td>True</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "        one  oneandhalf       two     three      four   flag\n",
       "a  0.081774    0.081774  0.689690  0.137227  0.771464  False\n",
       "b  0.191447    0.191447  0.185544  0.306146  0.376992  False\n",
       "c  0.954003    0.954003  0.415900  0.434817  1.369902  False\n",
       "d  0.290428    0.290428  0.441525  0.778144  0.731953   True"
      ]
     },
     "execution_count": 59,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.insert(1,'oneandhalf',df['one'])#指定插入列位置为1\n",
    "df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 60,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>one</th>\n",
       "      <th>two</th>\n",
       "      <th>flag</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>a</th>\n",
       "      <td>0.081774</td>\n",
       "      <td>0.689690</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>b</th>\n",
       "      <td>0.191447</td>\n",
       "      <td>0.185544</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>c</th>\n",
       "      <td>0.954003</td>\n",
       "      <td>0.415900</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>d</th>\n",
       "      <td>0.290428</td>\n",
       "      <td>0.441525</td>\n",
       "      <td>True</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "        one       two   flag\n",
       "a  0.081774  0.689690  False\n",
       "b  0.191447  0.185544  False\n",
       "c  0.954003  0.415900  False\n",
       "d  0.290428  0.441525   True"
      ]
     },
     "execution_count": 60,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "del df['three'],df['four'],df['oneandhalf']\n",
    "df"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "插入的列是一个标量时会自动应用广播法则（按列）"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 61,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>one</th>\n",
       "      <th>two</th>\n",
       "      <th>flag</th>\n",
       "      <th>foo</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>a</th>\n",
       "      <td>0.081774</td>\n",
       "      <td>0.689690</td>\n",
       "      <td>False</td>\n",
       "      <td>bar</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>b</th>\n",
       "      <td>0.191447</td>\n",
       "      <td>0.185544</td>\n",
       "      <td>False</td>\n",
       "      <td>bar</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>c</th>\n",
       "      <td>0.954003</td>\n",
       "      <td>0.415900</td>\n",
       "      <td>False</td>\n",
       "      <td>bar</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>d</th>\n",
       "      <td>0.290428</td>\n",
       "      <td>0.441525</td>\n",
       "      <td>True</td>\n",
       "      <td>bar</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "        one       two   flag  foo\n",
       "a  0.081774  0.689690  False  bar\n",
       "b  0.191447  0.185544  False  bar\n",
       "c  0.954003  0.415900  False  bar\n",
       "d  0.290428  0.441525   True  bar"
      ]
     },
     "execution_count": 61,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df['foo']='bar'\n",
    "df"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "插入的列与DataFrame的行数、行名不一致时会自动对齐"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 62,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>one</th>\n",
       "      <th>two</th>\n",
       "      <th>flag</th>\n",
       "      <th>foo</th>\n",
       "      <th>three</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>a</th>\n",
       "      <td>0.081774</td>\n",
       "      <td>0.689690</td>\n",
       "      <td>False</td>\n",
       "      <td>bar</td>\n",
       "      <td>0.081774</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>b</th>\n",
       "      <td>0.191447</td>\n",
       "      <td>0.185544</td>\n",
       "      <td>False</td>\n",
       "      <td>bar</td>\n",
       "      <td>0.191447</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>c</th>\n",
       "      <td>0.954003</td>\n",
       "      <td>0.415900</td>\n",
       "      <td>False</td>\n",
       "      <td>bar</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>d</th>\n",
       "      <td>0.290428</td>\n",
       "      <td>0.441525</td>\n",
       "      <td>True</td>\n",
       "      <td>bar</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "        one       two   flag  foo     three\n",
       "a  0.081774  0.689690  False  bar  0.081774\n",
       "b  0.191447  0.185544  False  bar  0.191447\n",
       "c  0.954003  0.415900  False  bar       NaN\n",
       "d  0.290428  0.441525   True  bar       NaN"
      ]
     },
     "execution_count": 62,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df['three']=df['one'][:2]\n",
    "df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 63,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>one</th>\n",
       "      <th>two</th>\n",
       "      <th>flag</th>\n",
       "      <th>foo</th>\n",
       "      <th>three</th>\n",
       "      <th>four</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>a</th>\n",
       "      <td>0.081774</td>\n",
       "      <td>0.689690</td>\n",
       "      <td>False</td>\n",
       "      <td>bar</td>\n",
       "      <td>0.081774</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>b</th>\n",
       "      <td>0.191447</td>\n",
       "      <td>0.185544</td>\n",
       "      <td>False</td>\n",
       "      <td>bar</td>\n",
       "      <td>0.191447</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>c</th>\n",
       "      <td>0.954003</td>\n",
       "      <td>0.415900</td>\n",
       "      <td>False</td>\n",
       "      <td>bar</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>d</th>\n",
       "      <td>0.290428</td>\n",
       "      <td>0.441525</td>\n",
       "      <td>True</td>\n",
       "      <td>bar</td>\n",
       "      <td>NaN</td>\n",
       "      <td>4.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "        one       two   flag  foo     three  four\n",
       "a  0.081774  0.689690  False  bar  0.081774   NaN\n",
       "b  0.191447  0.185544  False  bar  0.191447   NaN\n",
       "c  0.954003  0.415900  False  bar       NaN   NaN\n",
       "d  0.290428  0.441525   True  bar       NaN   4.0"
      ]
     },
     "execution_count": 63,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df['four']=pd.Series([4,5],index=['d','e'])\n",
    "df"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "> 由上可知，df并没有增加名称为“e”的行——我的理解是自动对齐只对右值（等号右边的）有效，所以df并不会对齐之后再插入df['four']列，只将右边添加的列自动对齐；而下面的例子则会把df也自动对齐，因为df在等号右边。当然这些自动对齐都不是在原位上进行的，df本身数据仍然没有变"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 64,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>flag</th>\n",
       "      <th>foo</th>\n",
       "      <th>four</th>\n",
       "      <th>one</th>\n",
       "      <th>three</th>\n",
       "      <th>two</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>a</th>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>b</th>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>c</th>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>d</th>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>8.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>e</th>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "  flag  foo  four  one  three  two\n",
       "a  NaN  NaN   NaN  NaN    NaN  NaN\n",
       "b  NaN  NaN   NaN  NaN    NaN  NaN\n",
       "c  NaN  NaN   NaN  NaN    NaN  NaN\n",
       "d  NaN  NaN   8.0  NaN    NaN  NaN\n",
       "e  NaN  NaN   NaN  NaN    NaN  NaN"
      ]
     },
     "execution_count": 64,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df+pd.DataFrame(pd.Series([4,5],index=['d','e'],name='four'))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 65,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>one</th>\n",
       "      <th>two</th>\n",
       "      <th>flag</th>\n",
       "      <th>foo</th>\n",
       "      <th>three</th>\n",
       "      <th>four</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>a</th>\n",
       "      <td>0.081774</td>\n",
       "      <td>0.689690</td>\n",
       "      <td>False</td>\n",
       "      <td>bar</td>\n",
       "      <td>0.081774</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>b</th>\n",
       "      <td>0.191447</td>\n",
       "      <td>0.185544</td>\n",
       "      <td>False</td>\n",
       "      <td>bar</td>\n",
       "      <td>0.191447</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>c</th>\n",
       "      <td>0.954003</td>\n",
       "      <td>0.415900</td>\n",
       "      <td>False</td>\n",
       "      <td>bar</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>d</th>\n",
       "      <td>0.290428</td>\n",
       "      <td>0.441525</td>\n",
       "      <td>True</td>\n",
       "      <td>bar</td>\n",
       "      <td>NaN</td>\n",
       "      <td>4.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "        one       two   flag  foo     three  four\n",
       "a  0.081774  0.689690  False  bar  0.081774   NaN\n",
       "b  0.191447  0.185544  False  bar  0.191447   NaN\n",
       "c  0.954003  0.415900  False  bar       NaN   NaN\n",
       "d  0.290428  0.441525   True  bar       NaN   4.0"
      ]
     },
     "execution_count": 65,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 使用方法链赋值新列  \n",
    "使用`assign()`函数可以由已有列生成新列"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 69,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Engineering</th>\n",
       "      <th>English</th>\n",
       "      <th>Management</th>\n",
       "      <th>CS</th>\n",
       "      <th>Mechanics</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>Li YX</th>\n",
       "      <td>75.987862</td>\n",
       "      <td>68.258449</td>\n",
       "      <td>74.933372</td>\n",
       "      <td>94.848686</td>\n",
       "      <td>85.861676</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Tang KS</th>\n",
       "      <td>78.730984</td>\n",
       "      <td>74.675663</td>\n",
       "      <td>78.473013</td>\n",
       "      <td>70.628554</td>\n",
       "      <td>89.375882</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Wang Q</th>\n",
       "      <td>79.579904</td>\n",
       "      <td>69.424659</td>\n",
       "      <td>74.911647</td>\n",
       "      <td>81.454416</td>\n",
       "      <td>77.725207</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Liu XH</th>\n",
       "      <td>75.472634</td>\n",
       "      <td>82.423732</td>\n",
       "      <td>84.027502</td>\n",
       "      <td>81.709782</td>\n",
       "      <td>78.177159</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "         Engineering    English  Management         CS  Mechanics\n",
       "Li YX      75.987862  68.258449   74.933372  94.848686  85.861676\n",
       "Tang KS    78.730984  74.675663   78.473013  70.628554  89.375882\n",
       "Wang Q     79.579904  69.424659   74.911647  81.454416  77.725207\n",
       "Liu XH     75.472634  82.423732   84.027502  81.709782  78.177159"
      ]
     },
     "execution_count": 69,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data=np.random.randn(4,5)*7+80\n",
    "data[data>100]=100\n",
    "data[data<60]=60\n",
    "df=pd.DataFrame(data,index=['Li YX','Tang KS','Wang Q','Liu XH'],columns=['Engineering','English','Management','CS','Mechanics'])\n",
    "df"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "`assign()`可用于由已有列生成新列"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 70,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Engineering</th>\n",
       "      <th>English</th>\n",
       "      <th>Management</th>\n",
       "      <th>CS</th>\n",
       "      <th>Mechanics</th>\n",
       "      <th>Total</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>Li YX</th>\n",
       "      <td>75.987862</td>\n",
       "      <td>68.258449</td>\n",
       "      <td>74.933372</td>\n",
       "      <td>94.848686</td>\n",
       "      <td>85.861676</td>\n",
       "      <td>399.890044</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Tang KS</th>\n",
       "      <td>78.730984</td>\n",
       "      <td>74.675663</td>\n",
       "      <td>78.473013</td>\n",
       "      <td>70.628554</td>\n",
       "      <td>89.375882</td>\n",
       "      <td>391.884096</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Wang Q</th>\n",
       "      <td>79.579904</td>\n",
       "      <td>69.424659</td>\n",
       "      <td>74.911647</td>\n",
       "      <td>81.454416</td>\n",
       "      <td>77.725207</td>\n",
       "      <td>383.095833</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Liu XH</th>\n",
       "      <td>75.472634</td>\n",
       "      <td>82.423732</td>\n",
       "      <td>84.027502</td>\n",
       "      <td>81.709782</td>\n",
       "      <td>78.177159</td>\n",
       "      <td>401.810809</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "         Engineering    English  Management         CS  Mechanics       Total\n",
       "Li YX      75.987862  68.258449   74.933372  94.848686  85.861676  399.890044\n",
       "Tang KS    78.730984  74.675663   78.473013  70.628554  89.375882  391.884096\n",
       "Wang Q     79.579904  69.424659   74.911647  81.454416  77.725207  383.095833\n",
       "Liu XH     75.472634  82.423732   84.027502  81.709782  78.177159  401.810809"
      ]
     },
     "execution_count": 70,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.assign(Total=df['Engineering']+df['English']+df['Management']+df['CS']+df['Mechanics'])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "`assign()`中可以使用函数进行列的计算"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 74,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Engineering</th>\n",
       "      <th>English</th>\n",
       "      <th>Management</th>\n",
       "      <th>CS</th>\n",
       "      <th>Mechanics</th>\n",
       "      <th>Average</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>Li YX</th>\n",
       "      <td>75.987862</td>\n",
       "      <td>68.258449</td>\n",
       "      <td>74.933372</td>\n",
       "      <td>94.848686</td>\n",
       "      <td>85.861676</td>\n",
       "      <td>79.978009</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Tang KS</th>\n",
       "      <td>78.730984</td>\n",
       "      <td>74.675663</td>\n",
       "      <td>78.473013</td>\n",
       "      <td>70.628554</td>\n",
       "      <td>89.375882</td>\n",
       "      <td>78.376819</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Wang Q</th>\n",
       "      <td>79.579904</td>\n",
       "      <td>69.424659</td>\n",
       "      <td>74.911647</td>\n",
       "      <td>81.454416</td>\n",
       "      <td>77.725207</td>\n",
       "      <td>76.619167</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Liu XH</th>\n",
       "      <td>75.472634</td>\n",
       "      <td>82.423732</td>\n",
       "      <td>84.027502</td>\n",
       "      <td>81.709782</td>\n",
       "      <td>78.177159</td>\n",
       "      <td>80.362162</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "         Engineering    English  Management         CS  Mechanics    Average\n",
       "Li YX      75.987862  68.258449   74.933372  94.848686  85.861676  79.978009\n",
       "Tang KS    78.730984  74.675663   78.473013  70.628554  89.375882  78.376819\n",
       "Wang Q     79.579904  69.424659   74.911647  81.454416  77.725207  76.619167\n",
       "Liu XH     75.472634  82.423732   84.027502  81.709782  78.177159  80.362162"
      ]
     },
     "execution_count": 74,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.assign(Average=lambda x:np.sum(x,axis=1)/5)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "可以对数据表中的符合条件的某几条记录（某几行）进行运算，这样不必对整个表进行计算（比如先进行查询再对查询结果计算）："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 76,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Engineering</th>\n",
       "      <th>English</th>\n",
       "      <th>Management</th>\n",
       "      <th>CS</th>\n",
       "      <th>Mechanics</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>Tang KS</th>\n",
       "      <td>78.730984</td>\n",
       "      <td>74.675663</td>\n",
       "      <td>78.473013</td>\n",
       "      <td>70.628554</td>\n",
       "      <td>89.375882</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Wang Q</th>\n",
       "      <td>79.579904</td>\n",
       "      <td>69.424659</td>\n",
       "      <td>74.911647</td>\n",
       "      <td>81.454416</td>\n",
       "      <td>77.725207</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "         Engineering    English  Management         CS  Mechanics\n",
       "Tang KS    78.730984  74.675663   78.473013  70.628554  89.375882\n",
       "Wang Q     79.579904  69.424659   74.911647  81.454416  77.725207"
      ]
     },
     "execution_count": 76,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.query('Engineering>76')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 77,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Engineering</th>\n",
       "      <th>English</th>\n",
       "      <th>Management</th>\n",
       "      <th>CS</th>\n",
       "      <th>Mechanics</th>\n",
       "      <th>GeneralEngineering</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>Li YX</th>\n",
       "      <td>75.987862</td>\n",
       "      <td>68.258449</td>\n",
       "      <td>74.933372</td>\n",
       "      <td>94.848686</td>\n",
       "      <td>85.861676</td>\n",
       "      <td>85.566074</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Wang Q</th>\n",
       "      <td>79.579904</td>\n",
       "      <td>69.424659</td>\n",
       "      <td>74.911647</td>\n",
       "      <td>81.454416</td>\n",
       "      <td>77.725207</td>\n",
       "      <td>79.586509</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Liu XH</th>\n",
       "      <td>75.472634</td>\n",
       "      <td>82.423732</td>\n",
       "      <td>84.027502</td>\n",
       "      <td>81.709782</td>\n",
       "      <td>78.177159</td>\n",
       "      <td>78.453192</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "        Engineering    English  Management         CS  Mechanics  \\\n",
       "Li YX     75.987862  68.258449   74.933372  94.848686  85.861676   \n",
       "Wang Q    79.579904  69.424659   74.911647  81.454416  77.725207   \n",
       "Liu XH    75.472634  82.423732   84.027502  81.709782  78.177159   \n",
       "\n",
       "        GeneralEngineering  \n",
       "Li YX            85.566074  \n",
       "Wang Q           79.586509  \n",
       "Liu XH           78.453192  "
      ]
     },
     "execution_count": 77,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.query('CS>80').assign(GeneralEngineering=lambda x:(x['Engineering']+x['CS']+x['Mechanics'])/3)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "`assign()`中使用的表达式中可以含有之前一个表达式计算得到的变量，如下。唯一有点小问题的是含有前一个表达式生成变量的表达式不能使用数据表来索引新生成的列，而只能使用`lambda`表达式（即匿名函数）,否则会出现键错误，因为调用函数把实参传进去时还没进行第一个表达式，所以不存在“Total”键，无法访问`df['Total']`，而使用`lambda`函数时并没有传进去具体的数据，只是传了一个函数的引用："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 88,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Engineering</th>\n",
       "      <th>English</th>\n",
       "      <th>Management</th>\n",
       "      <th>CS</th>\n",
       "      <th>Mechanics</th>\n",
       "      <th>Total</th>\n",
       "      <th>Average</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>Li YX</th>\n",
       "      <td>75.987862</td>\n",
       "      <td>68.258449</td>\n",
       "      <td>74.933372</td>\n",
       "      <td>94.848686</td>\n",
       "      <td>85.861676</td>\n",
       "      <td>399.890044</td>\n",
       "      <td>79.978009</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Tang KS</th>\n",
       "      <td>78.730984</td>\n",
       "      <td>74.675663</td>\n",
       "      <td>78.473013</td>\n",
       "      <td>70.628554</td>\n",
       "      <td>89.375882</td>\n",
       "      <td>391.884096</td>\n",
       "      <td>78.376819</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Wang Q</th>\n",
       "      <td>79.579904</td>\n",
       "      <td>69.424659</td>\n",
       "      <td>74.911647</td>\n",
       "      <td>81.454416</td>\n",
       "      <td>77.725207</td>\n",
       "      <td>383.095833</td>\n",
       "      <td>76.619167</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Liu XH</th>\n",
       "      <td>75.472634</td>\n",
       "      <td>82.423732</td>\n",
       "      <td>84.027502</td>\n",
       "      <td>81.709782</td>\n",
       "      <td>78.177159</td>\n",
       "      <td>401.810809</td>\n",
       "      <td>80.362162</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "         Engineering    English  Management         CS  Mechanics       Total  \\\n",
       "Li YX      75.987862  68.258449   74.933372  94.848686  85.861676  399.890044   \n",
       "Tang KS    78.730984  74.675663   78.473013  70.628554  89.375882  391.884096   \n",
       "Wang Q     79.579904  69.424659   74.911647  81.454416  77.725207  383.095833   \n",
       "Liu XH     75.472634  82.423732   84.027502  81.709782  78.177159  401.810809   \n",
       "\n",
       "           Average  \n",
       "Li YX    79.978009  \n",
       "Tang KS  78.376819  \n",
       "Wang Q   76.619167  \n",
       "Liu XH   80.362162  "
      ]
     },
     "execution_count": 88,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.assign(Total=lambda x:np.sum(x,axis=1),Average=lambda x:x['Total']/5)\n",
    "#df.assign(Total=lambda x:np.sum(x,axis=1),Average=df['Total']/5)这个不行"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 索引与选择"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "1. 选择列"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 89,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Li YX      94.848686\n",
       "Tang KS    70.628554\n",
       "Wang Q     81.454416\n",
       "Liu XH     81.709782\n",
       "Name: CS, dtype: float64"
      ]
     },
     "execution_count": 89,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df['CS']"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "2. 按标签选择行"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 90,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Engineering    78.730984\n",
       "English        74.675663\n",
       "Management     78.473013\n",
       "CS             70.628554\n",
       "Mechanics      89.375882\n",
       "Name: Tang KS, dtype: float64"
      ]
     },
     "execution_count": 90,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.loc['Tang KS']"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "3. 按序号选择行"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 93,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Engineering    79.579904\n",
       "English        69.424659\n",
       "Management     74.911647\n",
       "CS             81.454416\n",
       "Mechanics      77.725207\n",
       "Name: Wang Q, dtype: float64"
      ]
     },
     "execution_count": 93,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.iloc[2]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "4. 行切片"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 94,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Engineering</th>\n",
       "      <th>English</th>\n",
       "      <th>Management</th>\n",
       "      <th>CS</th>\n",
       "      <th>Mechanics</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>Li YX</th>\n",
       "      <td>75.987862</td>\n",
       "      <td>68.258449</td>\n",
       "      <td>74.933372</td>\n",
       "      <td>94.848686</td>\n",
       "      <td>85.861676</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Tang KS</th>\n",
       "      <td>78.730984</td>\n",
       "      <td>74.675663</td>\n",
       "      <td>78.473013</td>\n",
       "      <td>70.628554</td>\n",
       "      <td>89.375882</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Wang Q</th>\n",
       "      <td>79.579904</td>\n",
       "      <td>69.424659</td>\n",
       "      <td>74.911647</td>\n",
       "      <td>81.454416</td>\n",
       "      <td>77.725207</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "         Engineering    English  Management         CS  Mechanics\n",
       "Li YX      75.987862  68.258449   74.933372  94.848686  85.861676\n",
       "Tang KS    78.730984  74.675663   78.473013  70.628554  89.375882\n",
       "Wang Q     79.579904  69.424659   74.911647  81.454416  77.725207"
      ]
     },
     "execution_count": 94,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df[:-1]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "5. 布尔值行索引"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 95,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Engineering</th>\n",
       "      <th>English</th>\n",
       "      <th>Management</th>\n",
       "      <th>CS</th>\n",
       "      <th>Mechanics</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>Tang KS</th>\n",
       "      <td>78.730984</td>\n",
       "      <td>74.675663</td>\n",
       "      <td>78.473013</td>\n",
       "      <td>70.628554</td>\n",
       "      <td>89.375882</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Liu XH</th>\n",
       "      <td>75.472634</td>\n",
       "      <td>82.423732</td>\n",
       "      <td>84.027502</td>\n",
       "      <td>81.709782</td>\n",
       "      <td>78.177159</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "         Engineering    English  Management         CS  Mechanics\n",
       "Tang KS    78.730984  74.675663   78.473013  70.628554  89.375882\n",
       "Liu XH     75.472634  82.423732   84.027502  81.709782  78.177159"
      ]
     },
     "execution_count": 95,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df[df['English']>70]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 数据对齐与算术  \n",
    "所谓数据对齐就是两个`DataFrame`进行算术运算时，最后的行数、列数等于两个表中不同的行数总和与不同的列数总和，即两个数据表行列标签取并集，然后对原数据表中行标签、列标签都相同的元素进行相应算术运算"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 100,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(          0         1         2         3         4         5\n",
       " 0  0.004918 -0.633382 -0.862058  0.345601 -0.698983 -1.198451\n",
       " 1  0.000996 -1.792127 -0.080231  0.546962  0.879534  0.048649\n",
       " 2  0.619625 -0.192753 -0.060333  0.651259 -0.057265  0.720667\n",
       " 3 -0.386628  1.493021  0.107017  0.586775  0.879709  0.559901,\n",
       "           0         1         2         3\n",
       " 0 -1.101043 -0.527273  0.801759  0.786621\n",
       " 1 -0.757937 -1.220986 -1.169714 -0.757507\n",
       " 2  1.671402 -1.451858  0.099088 -0.008609,\n",
       "           0         1         2         3   4   5\n",
       " 0 -1.096125 -1.160655 -0.060300  1.132223 NaN NaN\n",
       " 1 -0.756941 -3.013113 -1.249945 -0.210546 NaN NaN\n",
       " 2  2.291027 -1.644611  0.038755  0.642650 NaN NaN\n",
       " 3       NaN       NaN       NaN       NaN NaN NaN)"
      ]
     },
     "execution_count": 100,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df1=pd.DataFrame(np.random.randn(4,6))\n",
    "df2=pd.DataFrame(np.random.randn(3,4))\n",
    "df1,df2,df1+df2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 101,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>0</th>\n",
       "      <th>1</th>\n",
       "      <th>2</th>\n",
       "      <th>3</th>\n",
       "      <th>4</th>\n",
       "      <th>5</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>2.024591</td>\n",
       "      <td>-1.166912</td>\n",
       "      <td>-2.310291</td>\n",
       "      <td>3.728007</td>\n",
       "      <td>-1.494916</td>\n",
       "      <td>-3.992253</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2.004981</td>\n",
       "      <td>-6.960634</td>\n",
       "      <td>1.598845</td>\n",
       "      <td>4.734808</td>\n",
       "      <td>6.397671</td>\n",
       "      <td>2.243245</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>5.098124</td>\n",
       "      <td>1.036233</td>\n",
       "      <td>1.698336</td>\n",
       "      <td>5.256293</td>\n",
       "      <td>1.713677</td>\n",
       "      <td>5.603337</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>0.066858</td>\n",
       "      <td>9.465105</td>\n",
       "      <td>2.535085</td>\n",
       "      <td>4.933873</td>\n",
       "      <td>6.398544</td>\n",
       "      <td>4.799507</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "          0         1         2         3         4         5\n",
       "0  2.024591 -1.166912 -2.310291  3.728007 -1.494916 -3.992253\n",
       "1  2.004981 -6.960634  1.598845  4.734808  6.397671  2.243245\n",
       "2  5.098124  1.036233  1.698336  5.256293  1.713677  5.603337\n",
       "3  0.066858  9.465105  2.535085  4.933873  6.398544  4.799507"
      ]
     },
     "execution_count": 101,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df1*5+2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 103,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>0</th>\n",
       "      <th>1</th>\n",
       "      <th>2</th>\n",
       "      <th>3</th>\n",
       "      <th>4</th>\n",
       "      <th>5</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>203.328949</td>\n",
       "      <td>-1.578825</td>\n",
       "      <td>-1.160014</td>\n",
       "      <td>2.893508</td>\n",
       "      <td>-1.430649</td>\n",
       "      <td>-0.834411</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1003.719277</td>\n",
       "      <td>-0.557996</td>\n",
       "      <td>-12.463998</td>\n",
       "      <td>1.828282</td>\n",
       "      <td>1.136966</td>\n",
       "      <td>20.555369</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1.613880</td>\n",
       "      <td>-5.187977</td>\n",
       "      <td>-16.574722</td>\n",
       "      <td>1.535489</td>\n",
       "      <td>-17.462777</td>\n",
       "      <td>1.387603</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>-2.586462</td>\n",
       "      <td>0.669783</td>\n",
       "      <td>9.344318</td>\n",
       "      <td>1.704232</td>\n",
       "      <td>1.136740</td>\n",
       "      <td>1.786029</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "             0         1          2         3          4          5\n",
       "0   203.328949 -1.578825  -1.160014  2.893508  -1.430649  -0.834411\n",
       "1  1003.719277 -0.557996 -12.463998  1.828282   1.136966  20.555369\n",
       "2     1.613880 -5.187977 -16.574722  1.535489 -17.462777   1.387603\n",
       "3    -2.586462  0.669783   9.344318  1.704232   1.136740   1.786029"
      ]
     },
     "execution_count": 103,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "1/df1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 111,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(       0      1      2     3      4      5\n",
       " 0   True  False  False  True  False  False\n",
       " 1   True  False  False  True   True   True\n",
       " 2   True  False  False  True  False   True\n",
       " 3  False   True   True  True   True   True,\n",
       "        0      1      2      3      4      5\n",
       " 0  False   True  False  False  False   True\n",
       " 1  False  False  False   True   True  False\n",
       " 2   True   True   True  False  False  False\n",
       " 3   True  False   True  False   True   True)"
      ]
     },
     "execution_count": 111,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df1=df1>0\n",
    "df2=pd.DataFrame(np.random.randn(4,6))>0\n",
    "df1,df2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 112,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>0</th>\n",
       "      <th>1</th>\n",
       "      <th>2</th>\n",
       "      <th>3</th>\n",
       "      <th>4</th>\n",
       "      <th>5</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>True</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "       0      1      2      3      4      5\n",
       "0  False  False  False  False  False  False\n",
       "1  False  False  False   True   True  False\n",
       "2   True  False  False  False  False  False\n",
       "3  False  False   True  False   True   True"
      ]
     },
     "execution_count": 112,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df1&df2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 113,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>0</th>\n",
       "      <th>1</th>\n",
       "      <th>2</th>\n",
       "      <th>3</th>\n",
       "      <th>4</th>\n",
       "      <th>5</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>True</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "       0      1      2      3      4      5\n",
       "0  False   True   True  False   True   True\n",
       "1  False   True   True  False  False  False\n",
       "2  False   True   True  False   True  False\n",
       "3   True  False  False  False  False  False"
      ]
     },
     "execution_count": 113,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "-df1"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 转置"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 114,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Li YX</th>\n",
       "      <th>Tang KS</th>\n",
       "      <th>Wang Q</th>\n",
       "      <th>Liu XH</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>Engineering</th>\n",
       "      <td>75.987862</td>\n",
       "      <td>78.730984</td>\n",
       "      <td>79.579904</td>\n",
       "      <td>75.472634</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>English</th>\n",
       "      <td>68.258449</td>\n",
       "      <td>74.675663</td>\n",
       "      <td>69.424659</td>\n",
       "      <td>82.423732</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Management</th>\n",
       "      <td>74.933372</td>\n",
       "      <td>78.473013</td>\n",
       "      <td>74.911647</td>\n",
       "      <td>84.027502</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>CS</th>\n",
       "      <td>94.848686</td>\n",
       "      <td>70.628554</td>\n",
       "      <td>81.454416</td>\n",
       "      <td>81.709782</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Mechanics</th>\n",
       "      <td>85.861676</td>\n",
       "      <td>89.375882</td>\n",
       "      <td>77.725207</td>\n",
       "      <td>78.177159</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                 Li YX    Tang KS     Wang Q     Liu XH\n",
       "Engineering  75.987862  78.730984  79.579904  75.472634\n",
       "English      68.258449  74.675663  69.424659  82.423732\n",
       "Management   74.933372  78.473013  74.911647  84.027502\n",
       "CS           94.848686  70.628554  81.454416  81.709782\n",
       "Mechanics    85.861676  89.375882  77.725207  78.177159"
      ]
     },
     "execution_count": 114,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.T"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 与Numpy的互操作  \n",
    "主要数据表中的数据是数值类型，就能无障碍地使用numpy中的按位运算函数`ufunc`比如`np.exp`，`np.sum`，`np.log`，`np.sqrt`等等"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 116,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Engineering</th>\n",
       "      <th>English</th>\n",
       "      <th>Management</th>\n",
       "      <th>CS</th>\n",
       "      <th>Mechanics</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>Li YX</th>\n",
       "      <td>87.171017</td>\n",
       "      <td>82.618671</td>\n",
       "      <td>86.564064</td>\n",
       "      <td>97.390290</td>\n",
       "      <td>92.661575</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Tang KS</th>\n",
       "      <td>88.730482</td>\n",
       "      <td>86.415081</td>\n",
       "      <td>88.584995</td>\n",
       "      <td>84.040796</td>\n",
       "      <td>94.538819</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Wang Q</th>\n",
       "      <td>89.207569</td>\n",
       "      <td>83.321461</td>\n",
       "      <td>86.551515</td>\n",
       "      <td>90.252100</td>\n",
       "      <td>88.161900</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Liu XH</th>\n",
       "      <td>86.874987</td>\n",
       "      <td>90.787517</td>\n",
       "      <td>91.666516</td>\n",
       "      <td>90.393463</td>\n",
       "      <td>88.417848</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "         Engineering    English  Management         CS  Mechanics\n",
       "Li YX      87.171017  82.618671   86.564064  97.390290  92.661575\n",
       "Tang KS    88.730482  86.415081   88.584995  84.040796  94.538819\n",
       "Wang Q     89.207569  83.321461   86.551515  90.252100  88.161900\n",
       "Liu XH     86.874987  90.787517   91.666516  90.393463  88.417848"
      ]
     },
     "execution_count": 116,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "10*np.sqrt(df)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 119,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0    0.494698\n",
      "1   -0.872681\n",
      "2   -0.660089\n",
      "3    0.677316\n",
      "4    1.098060\n",
      "dtype: float64\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "3.106507881403395"
      ]
     },
     "execution_count": 119,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "s1=pd.Series(np.random.randn(5))\n",
    "print(s1)\n",
    "s1.dot(s1)#求内积"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 列属性访问  \n",
    "数据表的列名可以像变量名一样，用于访问列"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 120,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Li YX      94.848686\n",
       "Tang KS    70.628554\n",
       "Wang Q     81.454416\n",
       "Liu XH     81.709782\n",
       "Name: CS, dtype: float64"
      ]
     },
     "execution_count": 120,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.CS"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## `Pandas`十分钟教程"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 对象创建  \n",
    "在数据结构介绍中已经详细介绍了多种`Series`和`DataFrame`的创建方式——我觉得比较好的方式是生成`Series`时使用一维`ndarray`或列表，然后指定index；生成`DataFrame`时使用二维`ndarray`或二维列表，然后指定index与columns。如果要对行列标签有更大的掌控权，比如生成二维的数据表时如果要指定哪些行列处的数据缺失，可以使用字典的字典，或者`Series`的字典"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 125,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "s1=\n",
      "0    1.0\n",
      "1    4.0\n",
      "2    3.0\n",
      "3    NaN\n",
      "4    6.0\n",
      "5    8.0\n",
      "dtype: float64\n",
      "s2=\n",
      "0    0.832745\n",
      "1    1.104834\n",
      "2    0.883904\n",
      "3    1.908310\n",
      "dtype: float64\n",
      "df1=\n",
      "   one  two  three  four\n",
      "a    1    2      5     8\n",
      "b    2    5      9     3\n",
      "c    7    5      2     0\n",
      "df2=\n",
      "          A         B         C         D         E\n",
      "a  0.707744  0.673457 -0.318665  1.233817  0.285659\n",
      "b -0.282963  1.230763 -0.137744 -1.696618 -1.321815\n",
      "c -1.125456 -1.045406 -0.482601 -0.048063 -0.860286\n",
      "d  0.027825  1.219672 -0.664755 -0.581099  0.747367\n"
     ]
    }
   ],
   "source": [
    "import pandas as pd\n",
    "import numpy as np\n",
    "s1=pd.Series([1,4,3,np.nan,6,8],index=list(range(6)))\n",
    "s2=pd.Series(np.empty(4),index=list(range(4)))\n",
    "df1=pd.DataFrame([[1,2,5,8],[2,5,9,3],[7,5,2,0]],index=['a','b','c'],columns=['one','two','three','four'])\n",
    "df2=pd.DataFrame(np.random.randn(4,5),index=list('abcd'),columns=list('ABCDE'))\n",
    "print('s1=')\n",
    "print(s1)\n",
    "print('s2=')\n",
    "print(s2)\n",
    "print('df1=')\n",
    "print(df1)\n",
    "print('df2=')\n",
    "print(df2)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "上面已经讲过，`DataFrame`的列可以像变量一样被索引，那么如果列名称刚好和一个变量重名会怎么办?"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 151,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "a    1\n",
       "b    2\n",
       "c    3\n",
       "Name: assign, dtype: int64"
      ]
     },
     "execution_count": 151,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df=pd.DataFrame({'assign':{'a':1,'b':2,'c':3},\n",
    "                 'T':{'a':4,'c':7}})\n",
    "#df\n",
    "#df.assign(five=df['assign']+df['T'])\n",
    "df.assign\n",
    "df['assign']\n",
    "#df.T\n",
    "#df['T']"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "> 事实证明，如果列名与变量名或函数名重名，将不能再通过变量方式访问，同名的函数与变量使用不受影响"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 数据查看"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 查看首尾部分记录"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 161,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "      <th>C</th>\n",
       "      <th>D</th>\n",
       "      <th>E</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>-0.062101</td>\n",
       "      <td>-1.078257</td>\n",
       "      <td>1.177289</td>\n",
       "      <td>-0.027442</td>\n",
       "      <td>1.211772</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>0.103013</td>\n",
       "      <td>0.392008</td>\n",
       "      <td>1.630711</td>\n",
       "      <td>1.274753</td>\n",
       "      <td>0.021503</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>2.076479</td>\n",
       "      <td>-0.596327</td>\n",
       "      <td>-0.180816</td>\n",
       "      <td>-1.539962</td>\n",
       "      <td>0.900922</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>-1.089340</td>\n",
       "      <td>-0.616007</td>\n",
       "      <td>0.402037</td>\n",
       "      <td>0.012556</td>\n",
       "      <td>-1.368815</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>-0.380664</td>\n",
       "      <td>-0.752829</td>\n",
       "      <td>0.286627</td>\n",
       "      <td>-0.660762</td>\n",
       "      <td>0.583335</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "          A         B         C         D         E\n",
       "1 -0.062101 -1.078257  1.177289 -0.027442  1.211772\n",
       "2  0.103013  0.392008  1.630711  1.274753  0.021503\n",
       "3  2.076479 -0.596327 -0.180816 -1.539962  0.900922\n",
       "4 -1.089340 -0.616007  0.402037  0.012556 -1.368815\n",
       "5 -0.380664 -0.752829  0.286627 -0.660762  0.583335"
      ]
     },
     "execution_count": 161,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df=pd.DataFrame(np.random.randn(40,5),index=list(range(1,41)),columns=list('ABCDE'))\n",
    "df.head()#默认5条记录"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 163,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "      <th>C</th>\n",
       "      <th>D</th>\n",
       "      <th>E</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>-0.062101</td>\n",
       "      <td>-1.078257</td>\n",
       "      <td>1.177289</td>\n",
       "      <td>-0.027442</td>\n",
       "      <td>1.211772</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>0.103013</td>\n",
       "      <td>0.392008</td>\n",
       "      <td>1.630711</td>\n",
       "      <td>1.274753</td>\n",
       "      <td>0.021503</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>2.076479</td>\n",
       "      <td>-0.596327</td>\n",
       "      <td>-0.180816</td>\n",
       "      <td>-1.539962</td>\n",
       "      <td>0.900922</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "          A         B         C         D         E\n",
       "1 -0.062101 -1.078257  1.177289 -0.027442  1.211772\n",
       "2  0.103013  0.392008  1.630711  1.274753  0.021503\n",
       "3  2.076479 -0.596327 -0.180816 -1.539962  0.900922"
      ]
     },
     "execution_count": 163,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.head(3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 164,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "      <th>C</th>\n",
       "      <th>D</th>\n",
       "      <th>E</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>36</th>\n",
       "      <td>0.435087</td>\n",
       "      <td>0.796471</td>\n",
       "      <td>0.366780</td>\n",
       "      <td>-0.388796</td>\n",
       "      <td>0.168838</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>37</th>\n",
       "      <td>0.760828</td>\n",
       "      <td>0.063407</td>\n",
       "      <td>-0.523649</td>\n",
       "      <td>-0.021345</td>\n",
       "      <td>-1.238092</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>38</th>\n",
       "      <td>-1.429357</td>\n",
       "      <td>0.744888</td>\n",
       "      <td>0.135597</td>\n",
       "      <td>0.237871</td>\n",
       "      <td>0.721818</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>39</th>\n",
       "      <td>0.681052</td>\n",
       "      <td>0.120146</td>\n",
       "      <td>-0.341561</td>\n",
       "      <td>-0.074470</td>\n",
       "      <td>2.644202</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>40</th>\n",
       "      <td>0.487668</td>\n",
       "      <td>3.104073</td>\n",
       "      <td>0.706086</td>\n",
       "      <td>0.885964</td>\n",
       "      <td>0.344888</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "           A         B         C         D         E\n",
       "36  0.435087  0.796471  0.366780 -0.388796  0.168838\n",
       "37  0.760828  0.063407 -0.523649 -0.021345 -1.238092\n",
       "38 -1.429357  0.744888  0.135597  0.237871  0.721818\n",
       "39  0.681052  0.120146 -0.341561 -0.074470  2.644202\n",
       "40  0.487668  3.104073  0.706086  0.885964  0.344888"
      ]
     },
     "execution_count": 164,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.tail()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 查看表的行列号"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 165,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Int64Index([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
       "            18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34,\n",
       "            35, 36, 37, 38, 39, 40],\n",
       "           dtype='int64')"
      ]
     },
     "execution_count": 165,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.index"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 166,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Index(['A', 'B', 'C', 'D', 'E'], dtype='object')"
      ]
     },
     "execution_count": 166,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.columns"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 查看表的基本统计信息"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 167,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "      <th>C</th>\n",
       "      <th>D</th>\n",
       "      <th>E</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>count</th>\n",
       "      <td>40.000000</td>\n",
       "      <td>40.000000</td>\n",
       "      <td>40.000000</td>\n",
       "      <td>40.000000</td>\n",
       "      <td>40.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>mean</th>\n",
       "      <td>0.166118</td>\n",
       "      <td>0.098793</td>\n",
       "      <td>-0.058017</td>\n",
       "      <td>-0.341744</td>\n",
       "      <td>-0.089269</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>std</th>\n",
       "      <td>0.926913</td>\n",
       "      <td>1.045696</td>\n",
       "      <td>1.210106</td>\n",
       "      <td>0.797258</td>\n",
       "      <td>0.978599</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>min</th>\n",
       "      <td>-1.696426</td>\n",
       "      <td>-1.764623</td>\n",
       "      <td>-2.926615</td>\n",
       "      <td>-2.001535</td>\n",
       "      <td>-2.018404</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25%</th>\n",
       "      <td>-0.433330</td>\n",
       "      <td>-0.601247</td>\n",
       "      <td>-0.803333</td>\n",
       "      <td>-0.739267</td>\n",
       "      <td>-0.861654</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>50%</th>\n",
       "      <td>0.206066</td>\n",
       "      <td>0.053874</td>\n",
       "      <td>0.211112</td>\n",
       "      <td>-0.221885</td>\n",
       "      <td>-0.014662</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>75%</th>\n",
       "      <td>0.735050</td>\n",
       "      <td>0.796908</td>\n",
       "      <td>0.685702</td>\n",
       "      <td>0.171243</td>\n",
       "      <td>0.635587</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>max</th>\n",
       "      <td>2.076479</td>\n",
       "      <td>3.104073</td>\n",
       "      <td>1.854809</td>\n",
       "      <td>1.274753</td>\n",
       "      <td>2.644202</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "               A          B          C          D          E\n",
       "count  40.000000  40.000000  40.000000  40.000000  40.000000\n",
       "mean    0.166118   0.098793  -0.058017  -0.341744  -0.089269\n",
       "std     0.926913   1.045696   1.210106   0.797258   0.978599\n",
       "min    -1.696426  -1.764623  -2.926615  -2.001535  -2.018404\n",
       "25%    -0.433330  -0.601247  -0.803333  -0.739267  -0.861654\n",
       "50%     0.206066   0.053874   0.211112  -0.221885  -0.014662\n",
       "75%     0.735050   0.796908   0.685702   0.171243   0.635587\n",
       "max     2.076479   3.104073   1.854809   1.274753   2.644202"
      ]
     },
     "execution_count": 167,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.describe()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 168,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "A    0.926913\n",
       "B    1.045696\n",
       "C    1.210106\n",
       "D    0.797258\n",
       "E    0.978599\n",
       "Name: std, dtype: float64"
      ]
     },
     "execution_count": 168,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.describe().loc['std']"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 转置"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 169,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>1</th>\n",
       "      <th>2</th>\n",
       "      <th>3</th>\n",
       "      <th>4</th>\n",
       "      <th>5</th>\n",
       "      <th>6</th>\n",
       "      <th>7</th>\n",
       "      <th>8</th>\n",
       "      <th>9</th>\n",
       "      <th>10</th>\n",
       "      <th>...</th>\n",
       "      <th>31</th>\n",
       "      <th>32</th>\n",
       "      <th>33</th>\n",
       "      <th>34</th>\n",
       "      <th>35</th>\n",
       "      <th>36</th>\n",
       "      <th>37</th>\n",
       "      <th>38</th>\n",
       "      <th>39</th>\n",
       "      <th>40</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>A</th>\n",
       "      <td>-0.062101</td>\n",
       "      <td>0.103013</td>\n",
       "      <td>2.076479</td>\n",
       "      <td>-1.089340</td>\n",
       "      <td>-0.380664</td>\n",
       "      <td>-1.378901</td>\n",
       "      <td>0.561948</td>\n",
       "      <td>0.314089</td>\n",
       "      <td>-1.596442</td>\n",
       "      <td>1.299213</td>\n",
       "      <td>...</td>\n",
       "      <td>0.703694</td>\n",
       "      <td>-0.274134</td>\n",
       "      <td>0.870909</td>\n",
       "      <td>-0.549939</td>\n",
       "      <td>-1.020007</td>\n",
       "      <td>0.435087</td>\n",
       "      <td>0.760828</td>\n",
       "      <td>-1.429357</td>\n",
       "      <td>0.681052</td>\n",
       "      <td>0.487668</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>B</th>\n",
       "      <td>-1.078257</td>\n",
       "      <td>0.392008</td>\n",
       "      <td>-0.596327</td>\n",
       "      <td>-0.616007</td>\n",
       "      <td>-0.752829</td>\n",
       "      <td>-1.296149</td>\n",
       "      <td>-0.134572</td>\n",
       "      <td>0.264684</td>\n",
       "      <td>-1.322799</td>\n",
       "      <td>-0.109218</td>\n",
       "      <td>...</td>\n",
       "      <td>-0.482973</td>\n",
       "      <td>-1.405206</td>\n",
       "      <td>0.236889</td>\n",
       "      <td>0.951827</td>\n",
       "      <td>-0.022907</td>\n",
       "      <td>0.796471</td>\n",
       "      <td>0.063407</td>\n",
       "      <td>0.744888</td>\n",
       "      <td>0.120146</td>\n",
       "      <td>3.104073</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>C</th>\n",
       "      <td>1.177289</td>\n",
       "      <td>1.630711</td>\n",
       "      <td>-0.180816</td>\n",
       "      <td>0.402037</td>\n",
       "      <td>0.286627</td>\n",
       "      <td>0.678908</td>\n",
       "      <td>-0.767582</td>\n",
       "      <td>-0.910587</td>\n",
       "      <td>-2.426908</td>\n",
       "      <td>-2.303974</td>\n",
       "      <td>...</td>\n",
       "      <td>-1.591000</td>\n",
       "      <td>1.758062</td>\n",
       "      <td>1.854809</td>\n",
       "      <td>-1.174188</td>\n",
       "      <td>-1.254712</td>\n",
       "      <td>0.366780</td>\n",
       "      <td>-0.523649</td>\n",
       "      <td>0.135597</td>\n",
       "      <td>-0.341561</td>\n",
       "      <td>0.706086</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>D</th>\n",
       "      <td>-0.027442</td>\n",
       "      <td>1.274753</td>\n",
       "      <td>-1.539962</td>\n",
       "      <td>0.012556</td>\n",
       "      <td>-0.660762</td>\n",
       "      <td>-0.609406</td>\n",
       "      <td>0.714209</td>\n",
       "      <td>-0.993118</td>\n",
       "      <td>0.527024</td>\n",
       "      <td>-1.838867</td>\n",
       "      <td>...</td>\n",
       "      <td>-0.272210</td>\n",
       "      <td>-0.008618</td>\n",
       "      <td>-1.601432</td>\n",
       "      <td>-1.841561</td>\n",
       "      <td>0.106945</td>\n",
       "      <td>-0.388796</td>\n",
       "      <td>-0.021345</td>\n",
       "      <td>0.237871</td>\n",
       "      <td>-0.074470</td>\n",
       "      <td>0.885964</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>E</th>\n",
       "      <td>1.211772</td>\n",
       "      <td>0.021503</td>\n",
       "      <td>0.900922</td>\n",
       "      <td>-1.368815</td>\n",
       "      <td>0.583335</td>\n",
       "      <td>0.635168</td>\n",
       "      <td>0.067721</td>\n",
       "      <td>-2.018404</td>\n",
       "      <td>-0.403593</td>\n",
       "      <td>-0.550381</td>\n",
       "      <td>...</td>\n",
       "      <td>-0.668063</td>\n",
       "      <td>-0.664433</td>\n",
       "      <td>-0.577484</td>\n",
       "      <td>-1.132124</td>\n",
       "      <td>0.813831</td>\n",
       "      <td>0.168838</td>\n",
       "      <td>-1.238092</td>\n",
       "      <td>0.721818</td>\n",
       "      <td>2.644202</td>\n",
       "      <td>0.344888</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 40 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "         1         2         3         4         5         6         7   \\\n",
       "A -0.062101  0.103013  2.076479 -1.089340 -0.380664 -1.378901  0.561948   \n",
       "B -1.078257  0.392008 -0.596327 -0.616007 -0.752829 -1.296149 -0.134572   \n",
       "C  1.177289  1.630711 -0.180816  0.402037  0.286627  0.678908 -0.767582   \n",
       "D -0.027442  1.274753 -1.539962  0.012556 -0.660762 -0.609406  0.714209   \n",
       "E  1.211772  0.021503  0.900922 -1.368815  0.583335  0.635168  0.067721   \n",
       "\n",
       "         8         9         10    ...           31        32        33  \\\n",
       "A  0.314089 -1.596442  1.299213    ...     0.703694 -0.274134  0.870909   \n",
       "B  0.264684 -1.322799 -0.109218    ...    -0.482973 -1.405206  0.236889   \n",
       "C -0.910587 -2.426908 -2.303974    ...    -1.591000  1.758062  1.854809   \n",
       "D -0.993118  0.527024 -1.838867    ...    -0.272210 -0.008618 -1.601432   \n",
       "E -2.018404 -0.403593 -0.550381    ...    -0.668063 -0.664433 -0.577484   \n",
       "\n",
       "         34        35        36        37        38        39        40  \n",
       "A -0.549939 -1.020007  0.435087  0.760828 -1.429357  0.681052  0.487668  \n",
       "B  0.951827 -0.022907  0.796471  0.063407  0.744888  0.120146  3.104073  \n",
       "C -1.174188 -1.254712  0.366780 -0.523649  0.135597 -0.341561  0.706086  \n",
       "D -1.841561  0.106945 -0.388796 -0.021345  0.237871 -0.074470  0.885964  \n",
       "E -1.132124  0.813831  0.168838 -1.238092  0.721818  2.644202  0.344888  \n",
       "\n",
       "[5 rows x 40 columns]"
      ]
     },
     "execution_count": 169,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.T"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 170,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>1</th>\n",
       "      <th>2</th>\n",
       "      <th>3</th>\n",
       "      <th>4</th>\n",
       "      <th>5</th>\n",
       "      <th>6</th>\n",
       "      <th>7</th>\n",
       "      <th>8</th>\n",
       "      <th>9</th>\n",
       "      <th>10</th>\n",
       "      <th>...</th>\n",
       "      <th>31</th>\n",
       "      <th>32</th>\n",
       "      <th>33</th>\n",
       "      <th>34</th>\n",
       "      <th>35</th>\n",
       "      <th>36</th>\n",
       "      <th>37</th>\n",
       "      <th>38</th>\n",
       "      <th>39</th>\n",
       "      <th>40</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>A</th>\n",
       "      <td>-0.062101</td>\n",
       "      <td>0.103013</td>\n",
       "      <td>2.076479</td>\n",
       "      <td>-1.089340</td>\n",
       "      <td>-0.380664</td>\n",
       "      <td>-1.378901</td>\n",
       "      <td>0.561948</td>\n",
       "      <td>0.314089</td>\n",
       "      <td>-1.596442</td>\n",
       "      <td>1.299213</td>\n",
       "      <td>...</td>\n",
       "      <td>0.703694</td>\n",
       "      <td>-0.274134</td>\n",
       "      <td>0.870909</td>\n",
       "      <td>-0.549939</td>\n",
       "      <td>-1.020007</td>\n",
       "      <td>0.435087</td>\n",
       "      <td>0.760828</td>\n",
       "      <td>-1.429357</td>\n",
       "      <td>0.681052</td>\n",
       "      <td>0.487668</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>B</th>\n",
       "      <td>-1.078257</td>\n",
       "      <td>0.392008</td>\n",
       "      <td>-0.596327</td>\n",
       "      <td>-0.616007</td>\n",
       "      <td>-0.752829</td>\n",
       "      <td>-1.296149</td>\n",
       "      <td>-0.134572</td>\n",
       "      <td>0.264684</td>\n",
       "      <td>-1.322799</td>\n",
       "      <td>-0.109218</td>\n",
       "      <td>...</td>\n",
       "      <td>-0.482973</td>\n",
       "      <td>-1.405206</td>\n",
       "      <td>0.236889</td>\n",
       "      <td>0.951827</td>\n",
       "      <td>-0.022907</td>\n",
       "      <td>0.796471</td>\n",
       "      <td>0.063407</td>\n",
       "      <td>0.744888</td>\n",
       "      <td>0.120146</td>\n",
       "      <td>3.104073</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>C</th>\n",
       "      <td>1.177289</td>\n",
       "      <td>1.630711</td>\n",
       "      <td>-0.180816</td>\n",
       "      <td>0.402037</td>\n",
       "      <td>0.286627</td>\n",
       "      <td>0.678908</td>\n",
       "      <td>-0.767582</td>\n",
       "      <td>-0.910587</td>\n",
       "      <td>-2.426908</td>\n",
       "      <td>-2.303974</td>\n",
       "      <td>...</td>\n",
       "      <td>-1.591000</td>\n",
       "      <td>1.758062</td>\n",
       "      <td>1.854809</td>\n",
       "      <td>-1.174188</td>\n",
       "      <td>-1.254712</td>\n",
       "      <td>0.366780</td>\n",
       "      <td>-0.523649</td>\n",
       "      <td>0.135597</td>\n",
       "      <td>-0.341561</td>\n",
       "      <td>0.706086</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>D</th>\n",
       "      <td>-0.027442</td>\n",
       "      <td>1.274753</td>\n",
       "      <td>-1.539962</td>\n",
       "      <td>0.012556</td>\n",
       "      <td>-0.660762</td>\n",
       "      <td>-0.609406</td>\n",
       "      <td>0.714209</td>\n",
       "      <td>-0.993118</td>\n",
       "      <td>0.527024</td>\n",
       "      <td>-1.838867</td>\n",
       "      <td>...</td>\n",
       "      <td>-0.272210</td>\n",
       "      <td>-0.008618</td>\n",
       "      <td>-1.601432</td>\n",
       "      <td>-1.841561</td>\n",
       "      <td>0.106945</td>\n",
       "      <td>-0.388796</td>\n",
       "      <td>-0.021345</td>\n",
       "      <td>0.237871</td>\n",
       "      <td>-0.074470</td>\n",
       "      <td>0.885964</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>E</th>\n",
       "      <td>1.211772</td>\n",
       "      <td>0.021503</td>\n",
       "      <td>0.900922</td>\n",
       "      <td>-1.368815</td>\n",
       "      <td>0.583335</td>\n",
       "      <td>0.635168</td>\n",
       "      <td>0.067721</td>\n",
       "      <td>-2.018404</td>\n",
       "      <td>-0.403593</td>\n",
       "      <td>-0.550381</td>\n",
       "      <td>...</td>\n",
       "      <td>-0.668063</td>\n",
       "      <td>-0.664433</td>\n",
       "      <td>-0.577484</td>\n",
       "      <td>-1.132124</td>\n",
       "      <td>0.813831</td>\n",
       "      <td>0.168838</td>\n",
       "      <td>-1.238092</td>\n",
       "      <td>0.721818</td>\n",
       "      <td>2.644202</td>\n",
       "      <td>0.344888</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 40 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "         1         2         3         4         5         6         7   \\\n",
       "A -0.062101  0.103013  2.076479 -1.089340 -0.380664 -1.378901  0.561948   \n",
       "B -1.078257  0.392008 -0.596327 -0.616007 -0.752829 -1.296149 -0.134572   \n",
       "C  1.177289  1.630711 -0.180816  0.402037  0.286627  0.678908 -0.767582   \n",
       "D -0.027442  1.274753 -1.539962  0.012556 -0.660762 -0.609406  0.714209   \n",
       "E  1.211772  0.021503  0.900922 -1.368815  0.583335  0.635168  0.067721   \n",
       "\n",
       "         8         9         10    ...           31        32        33  \\\n",
       "A  0.314089 -1.596442  1.299213    ...     0.703694 -0.274134  0.870909   \n",
       "B  0.264684 -1.322799 -0.109218    ...    -0.482973 -1.405206  0.236889   \n",
       "C -0.910587 -2.426908 -2.303974    ...    -1.591000  1.758062  1.854809   \n",
       "D -0.993118  0.527024 -1.838867    ...    -0.272210 -0.008618 -1.601432   \n",
       "E -2.018404 -0.403593 -0.550381    ...    -0.668063 -0.664433 -0.577484   \n",
       "\n",
       "         34        35        36        37        38        39        40  \n",
       "A -0.549939 -1.020007  0.435087  0.760828 -1.429357  0.681052  0.487668  \n",
       "B  0.951827 -0.022907  0.796471  0.063407  0.744888  0.120146  3.104073  \n",
       "C -1.174188 -1.254712  0.366780 -0.523649  0.135597 -0.341561  0.706086  \n",
       "D -1.841561  0.106945 -0.388796 -0.021345  0.237871 -0.074470  0.885964  \n",
       "E -1.132124  0.813831  0.168838 -1.238092  0.721818  2.644202  0.344888  \n",
       "\n",
       "[5 rows x 40 columns]"
      ]
     },
     "execution_count": 170,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.transpose()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 排序"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 172,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>E</th>\n",
       "      <th>D</th>\n",
       "      <th>C</th>\n",
       "      <th>B</th>\n",
       "      <th>A</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1.211772</td>\n",
       "      <td>-0.027442</td>\n",
       "      <td>1.177289</td>\n",
       "      <td>-1.078257</td>\n",
       "      <td>-0.062101</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>0.021503</td>\n",
       "      <td>1.274753</td>\n",
       "      <td>1.630711</td>\n",
       "      <td>0.392008</td>\n",
       "      <td>0.103013</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>0.900922</td>\n",
       "      <td>-1.539962</td>\n",
       "      <td>-0.180816</td>\n",
       "      <td>-0.596327</td>\n",
       "      <td>2.076479</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>-1.368815</td>\n",
       "      <td>0.012556</td>\n",
       "      <td>0.402037</td>\n",
       "      <td>-0.616007</td>\n",
       "      <td>-1.089340</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>0.583335</td>\n",
       "      <td>-0.660762</td>\n",
       "      <td>0.286627</td>\n",
       "      <td>-0.752829</td>\n",
       "      <td>-0.380664</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "          E         D         C         B         A\n",
       "1  1.211772 -0.027442  1.177289 -1.078257 -0.062101\n",
       "2  0.021503  1.274753  1.630711  0.392008  0.103013\n",
       "3  0.900922 -1.539962 -0.180816 -0.596327  2.076479\n",
       "4 -1.368815  0.012556  0.402037 -0.616007 -1.089340\n",
       "5  0.583335 -0.660762  0.286627 -0.752829 -0.380664"
      ]
     },
     "execution_count": 172,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.sort_index(axis=1,ascending=False).head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 173,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "      <th>C</th>\n",
       "      <th>D</th>\n",
       "      <th>E</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>2.076479</td>\n",
       "      <td>-0.596327</td>\n",
       "      <td>-0.180816</td>\n",
       "      <td>-1.539962</td>\n",
       "      <td>0.900922</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11</th>\n",
       "      <td>1.798114</td>\n",
       "      <td>-0.581744</td>\n",
       "      <td>-0.000794</td>\n",
       "      <td>-0.734695</td>\n",
       "      <td>1.707054</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>13</th>\n",
       "      <td>1.494819</td>\n",
       "      <td>0.818553</td>\n",
       "      <td>-1.321054</td>\n",
       "      <td>-0.508548</td>\n",
       "      <td>-0.847334</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>20</th>\n",
       "      <td>1.435224</td>\n",
       "      <td>0.878503</td>\n",
       "      <td>0.378203</td>\n",
       "      <td>0.286078</td>\n",
       "      <td>-0.943247</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>1.299213</td>\n",
       "      <td>-0.109218</td>\n",
       "      <td>-2.303974</td>\n",
       "      <td>-1.838867</td>\n",
       "      <td>-0.550381</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>15</th>\n",
       "      <td>1.259794</td>\n",
       "      <td>0.457626</td>\n",
       "      <td>0.104392</td>\n",
       "      <td>-0.038785</td>\n",
       "      <td>0.636846</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>30</th>\n",
       "      <td>1.058007</td>\n",
       "      <td>-0.061558</td>\n",
       "      <td>0.380465</td>\n",
       "      <td>-0.660160</td>\n",
       "      <td>0.991072</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "           A         B         C         D         E\n",
       "3   2.076479 -0.596327 -0.180816 -1.539962  0.900922\n",
       "11  1.798114 -0.581744 -0.000794 -0.734695  1.707054\n",
       "13  1.494819  0.818553 -1.321054 -0.508548 -0.847334\n",
       "20  1.435224  0.878503  0.378203  0.286078 -0.943247\n",
       "10  1.299213 -0.109218 -2.303974 -1.838867 -0.550381\n",
       "15  1.259794  0.457626  0.104392 -0.038785  0.636846\n",
       "30  1.058007 -0.061558  0.380465 -0.660160  0.991072"
      ]
     },
     "execution_count": 173,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.sort_values(by='A',ascending=False).head(7)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 数据读写"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 数据访问  \n",
    "前面数据结构的部分已经讲了`[]`方式索引列、行切片、布尔值索引，以及使用`loc[]`方式的按名索引行和使用`iloc[]`的按序号索引行；总结来说：  \n",
    "- `[]`更像是一种直观的、快捷的索引方式，但是相对来说一个语境一个语法，缺乏规则性，各个用法能记住最好\n",
    "- `loc[]`是标签索引，用标签来索引行、列，用逗号分开行、列的标签，还可以进行切片，基本与直观的意思无差别\n",
    "- `iloc[]`是序号索引，使用行列序号来进行索引，用逗号隔开行、列索引，其用法与matlab几乎雷同，对于matlab用户来说简直就是breeze\n",
    "- `at[]`就像是`loc[]`的mini版，使用行列标签进行索引，区别是不可以进行切片，只能用来索引单个值\n",
    "- `iat[]`同样的是`iloc[]`的mini版，用序号来索引单个值；  \n",
    "\n",
    "之所以有`at[]`和`iat[]`可能是进行了某种的优化使其访问速度大大提升，官方建议**生产代码使用优化过的pandas数据访问函数`at[]`，`iat[]`，`loc[]`，`iloc[]`**，这样，一般情况下记住：**`loc[]`按标签索引与切片，`iloc[]`按序号索引与切片，`[]`使用布尔值索引**  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 174,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>E</th>\n",
       "      <th>D</th>\n",
       "      <th>C</th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>a</th>\n",
       "      <td>0.169273</td>\n",
       "      <td>-1.797600</td>\n",
       "      <td>0.625156</td>\n",
       "      <td>-0.385521</td>\n",
       "      <td>-1.647343</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>b</th>\n",
       "      <td>1.270448</td>\n",
       "      <td>-0.692322</td>\n",
       "      <td>0.330873</td>\n",
       "      <td>-0.730681</td>\n",
       "      <td>-2.053656</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>c</th>\n",
       "      <td>-0.973452</td>\n",
       "      <td>-0.509788</td>\n",
       "      <td>-2.197159</td>\n",
       "      <td>0.877961</td>\n",
       "      <td>0.608986</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>d</th>\n",
       "      <td>-0.335541</td>\n",
       "      <td>0.504698</td>\n",
       "      <td>-0.956252</td>\n",
       "      <td>0.265707</td>\n",
       "      <td>-0.028525</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>e</th>\n",
       "      <td>-0.192731</td>\n",
       "      <td>0.166707</td>\n",
       "      <td>-1.944066</td>\n",
       "      <td>0.777644</td>\n",
       "      <td>-1.774240</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>f</th>\n",
       "      <td>0.400664</td>\n",
       "      <td>-0.223873</td>\n",
       "      <td>-1.359455</td>\n",
       "      <td>0.151622</td>\n",
       "      <td>-1.015208</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "          E         D         C         A         B\n",
       "a  0.169273 -1.797600  0.625156 -0.385521 -1.647343\n",
       "b  1.270448 -0.692322  0.330873 -0.730681 -2.053656\n",
       "c -0.973452 -0.509788 -2.197159  0.877961  0.608986\n",
       "d -0.335541  0.504698 -0.956252  0.265707 -0.028525\n",
       "e -0.192731  0.166707 -1.944066  0.777644 -1.774240\n",
       "f  0.400664 -0.223873 -1.359455  0.151622 -1.015208"
      ]
     },
     "execution_count": 174,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df=pd.DataFrame(np.random.randn(6,5),index=list('abcdef'),columns=list('EDCAB'))\n",
    "df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 176,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "a   -1.797600\n",
       "b   -0.692322\n",
       "c   -0.509788\n",
       "d    0.504698\n",
       "e    0.166707\n",
       "f   -0.223873\n",
       "Name: D, dtype: float64"
      ]
     },
     "execution_count": 176,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df['D']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 177,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>E</th>\n",
       "      <th>D</th>\n",
       "      <th>C</th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>c</th>\n",
       "      <td>-0.973452</td>\n",
       "      <td>-0.509788</td>\n",
       "      <td>-2.197159</td>\n",
       "      <td>0.877961</td>\n",
       "      <td>0.608986</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>d</th>\n",
       "      <td>-0.335541</td>\n",
       "      <td>0.504698</td>\n",
       "      <td>-0.956252</td>\n",
       "      <td>0.265707</td>\n",
       "      <td>-0.028525</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>e</th>\n",
       "      <td>-0.192731</td>\n",
       "      <td>0.166707</td>\n",
       "      <td>-1.944066</td>\n",
       "      <td>0.777644</td>\n",
       "      <td>-1.774240</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "          E         D         C         A         B\n",
       "c -0.973452 -0.509788 -2.197159  0.877961  0.608986\n",
       "d -0.335541  0.504698 -0.956252  0.265707 -0.028525\n",
       "e -0.192731  0.166707 -1.944066  0.777644 -1.774240"
      ]
     },
     "execution_count": 177,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df['c':'e']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 182,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>E</th>\n",
       "      <th>D</th>\n",
       "      <th>C</th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>b</th>\n",
       "      <td>1.270448</td>\n",
       "      <td>-0.692322</td>\n",
       "      <td>0.330873</td>\n",
       "      <td>-0.730681</td>\n",
       "      <td>-2.053656</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>c</th>\n",
       "      <td>-0.973452</td>\n",
       "      <td>-0.509788</td>\n",
       "      <td>-2.197159</td>\n",
       "      <td>0.877961</td>\n",
       "      <td>0.608986</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "          E         D         C         A         B\n",
       "b  1.270448 -0.692322  0.330873 -0.730681 -2.053656\n",
       "c -0.973452 -0.509788 -2.197159  0.877961  0.608986"
      ]
     },
     "execution_count": 182,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df[1:3]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**`[]`的布尔值索引用法**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 201,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>E</th>\n",
       "      <th>D</th>\n",
       "      <th>C</th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>a</th>\n",
       "      <td>0.169273</td>\n",
       "      <td>-1.797600</td>\n",
       "      <td>0.625156</td>\n",
       "      <td>-0.385521</td>\n",
       "      <td>-1.647343</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>b</th>\n",
       "      <td>1.270448</td>\n",
       "      <td>-0.692322</td>\n",
       "      <td>0.330873</td>\n",
       "      <td>-0.730681</td>\n",
       "      <td>-2.053656</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "          E         D         C         A         B\n",
       "a  0.169273 -1.797600  0.625156 -0.385521 -1.647343\n",
       "b  1.270448 -0.692322  0.330873 -0.730681 -2.053656"
      ]
     },
     "execution_count": 201,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df[df['C']>0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 199,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>E</th>\n",
       "      <th>D</th>\n",
       "      <th>C</th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>a</th>\n",
       "      <td>0.169273</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.625156</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>b</th>\n",
       "      <td>1.270448</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.330873</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>c</th>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.877961</td>\n",
       "      <td>0.608986</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>d</th>\n",
       "      <td>NaN</td>\n",
       "      <td>0.504698</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.265707</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>e</th>\n",
       "      <td>NaN</td>\n",
       "      <td>0.166707</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.777644</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>f</th>\n",
       "      <td>0.400664</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.151622</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "          E         D         C         A         B\n",
       "a  0.169273       NaN  0.625156       NaN       NaN\n",
       "b  1.270448       NaN  0.330873       NaN       NaN\n",
       "c       NaN       NaN       NaN  0.877961  0.608986\n",
       "d       NaN  0.504698       NaN  0.265707       NaN\n",
       "e       NaN  0.166707       NaN  0.777644       NaN\n",
       "f  0.400664       NaN       NaN  0.151622       NaN"
      ]
     },
     "execution_count": 199,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df[df>0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 202,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>E</th>\n",
       "      <th>D</th>\n",
       "      <th>C</th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "      <th>F</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>a</th>\n",
       "      <td>0.169273</td>\n",
       "      <td>-1.797600</td>\n",
       "      <td>0.625156</td>\n",
       "      <td>-0.385521</td>\n",
       "      <td>-1.647343</td>\n",
       "      <td>class1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>b</th>\n",
       "      <td>1.270448</td>\n",
       "      <td>-0.692322</td>\n",
       "      <td>0.330873</td>\n",
       "      <td>-0.730681</td>\n",
       "      <td>-2.053656</td>\n",
       "      <td>class2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>c</th>\n",
       "      <td>-0.973452</td>\n",
       "      <td>-0.509788</td>\n",
       "      <td>-2.197159</td>\n",
       "      <td>0.877961</td>\n",
       "      <td>0.608986</td>\n",
       "      <td>class1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>d</th>\n",
       "      <td>-0.335541</td>\n",
       "      <td>0.504698</td>\n",
       "      <td>-0.956252</td>\n",
       "      <td>0.265707</td>\n",
       "      <td>-0.028525</td>\n",
       "      <td>class3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>e</th>\n",
       "      <td>-0.192731</td>\n",
       "      <td>0.166707</td>\n",
       "      <td>-1.944066</td>\n",
       "      <td>0.777644</td>\n",
       "      <td>-1.774240</td>\n",
       "      <td>class2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>f</th>\n",
       "      <td>0.400664</td>\n",
       "      <td>-0.223873</td>\n",
       "      <td>-1.359455</td>\n",
       "      <td>0.151622</td>\n",
       "      <td>-1.015208</td>\n",
       "      <td>class1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "          E         D         C         A         B       F\n",
       "a  0.169273 -1.797600  0.625156 -0.385521 -1.647343  class1\n",
       "b  1.270448 -0.692322  0.330873 -0.730681 -2.053656  class2\n",
       "c -0.973452 -0.509788 -2.197159  0.877961  0.608986  class1\n",
       "d -0.335541  0.504698 -0.956252  0.265707 -0.028525  class3\n",
       "e -0.192731  0.166707 -1.944066  0.777644 -1.774240  class2\n",
       "f  0.400664 -0.223873 -1.359455  0.151622 -1.015208  class1"
      ]
     },
     "execution_count": 202,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df['F']=['class1','class2','class1','class3','class2','class1']\n",
    "df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 203,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>E</th>\n",
       "      <th>D</th>\n",
       "      <th>C</th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "      <th>F</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>a</th>\n",
       "      <td>0.169273</td>\n",
       "      <td>-1.797600</td>\n",
       "      <td>0.625156</td>\n",
       "      <td>-0.385521</td>\n",
       "      <td>-1.647343</td>\n",
       "      <td>class1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>c</th>\n",
       "      <td>-0.973452</td>\n",
       "      <td>-0.509788</td>\n",
       "      <td>-2.197159</td>\n",
       "      <td>0.877961</td>\n",
       "      <td>0.608986</td>\n",
       "      <td>class1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>d</th>\n",
       "      <td>-0.335541</td>\n",
       "      <td>0.504698</td>\n",
       "      <td>-0.956252</td>\n",
       "      <td>0.265707</td>\n",
       "      <td>-0.028525</td>\n",
       "      <td>class3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>f</th>\n",
       "      <td>0.400664</td>\n",
       "      <td>-0.223873</td>\n",
       "      <td>-1.359455</td>\n",
       "      <td>0.151622</td>\n",
       "      <td>-1.015208</td>\n",
       "      <td>class1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "          E         D         C         A         B       F\n",
       "a  0.169273 -1.797600  0.625156 -0.385521 -1.647343  class1\n",
       "c -0.973452 -0.509788 -2.197159  0.877961  0.608986  class1\n",
       "d -0.335541  0.504698 -0.956252  0.265707 -0.028525  class3\n",
       "f  0.400664 -0.223873 -1.359455  0.151622 -1.015208  class1"
      ]
     },
     "execution_count": 203,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df[df.F.isin(['class1','class3'])]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "`loc[]`多标签索引"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 204,
   "metadata": {},
   "outputs": [],
   "source": [
    "del df['F']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 205,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>E</th>\n",
       "      <th>D</th>\n",
       "      <th>C</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>a</th>\n",
       "      <td>0.169273</td>\n",
       "      <td>-1.797600</td>\n",
       "      <td>0.625156</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>b</th>\n",
       "      <td>1.270448</td>\n",
       "      <td>-0.692322</td>\n",
       "      <td>0.330873</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>c</th>\n",
       "      <td>-0.973452</td>\n",
       "      <td>-0.509788</td>\n",
       "      <td>-2.197159</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "          E         D         C\n",
       "a  0.169273 -1.797600  0.625156\n",
       "b  1.270448 -0.692322  0.330873\n",
       "c -0.973452 -0.509788 -2.197159"
      ]
     },
     "execution_count": 205,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.loc['a':'c','E':'C']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 206,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>D</th>\n",
       "      <th>B</th>\n",
       "      <th>E</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>b</th>\n",
       "      <td>-0.692322</td>\n",
       "      <td>-2.053656</td>\n",
       "      <td>1.270448</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>d</th>\n",
       "      <td>0.504698</td>\n",
       "      <td>-0.028525</td>\n",
       "      <td>-0.335541</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>a</th>\n",
       "      <td>-1.797600</td>\n",
       "      <td>-1.647343</td>\n",
       "      <td>0.169273</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>b</th>\n",
       "      <td>-0.692322</td>\n",
       "      <td>-2.053656</td>\n",
       "      <td>1.270448</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "          D         B         E\n",
       "b -0.692322 -2.053656  1.270448\n",
       "d  0.504698 -0.028525 -0.335541\n",
       "a -1.797600 -1.647343  0.169273\n",
       "b -0.692322 -2.053656  1.270448"
      ]
     },
     "execution_count": 206,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.loc[['b','d','a','b'],['D','B','E']]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 207,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "-1.77424020073571"
      ]
     },
     "execution_count": 207,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.loc['e','B']"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "`iloc[]`多标签索引"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 208,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>E</th>\n",
       "      <th>D</th>\n",
       "      <th>C</th>\n",
       "      <th>A</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>b</th>\n",
       "      <td>1.270448</td>\n",
       "      <td>-0.692322</td>\n",
       "      <td>0.330873</td>\n",
       "      <td>-0.730681</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>c</th>\n",
       "      <td>-0.973452</td>\n",
       "      <td>-0.509788</td>\n",
       "      <td>-2.197159</td>\n",
       "      <td>0.877961</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>d</th>\n",
       "      <td>-0.335541</td>\n",
       "      <td>0.504698</td>\n",
       "      <td>-0.956252</td>\n",
       "      <td>0.265707</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>e</th>\n",
       "      <td>-0.192731</td>\n",
       "      <td>0.166707</td>\n",
       "      <td>-1.944066</td>\n",
       "      <td>0.777644</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>f</th>\n",
       "      <td>0.400664</td>\n",
       "      <td>-0.223873</td>\n",
       "      <td>-1.359455</td>\n",
       "      <td>0.151622</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "          E         D         C         A\n",
       "b  1.270448 -0.692322  0.330873 -0.730681\n",
       "c -0.973452 -0.509788 -2.197159  0.877961\n",
       "d -0.335541  0.504698 -0.956252  0.265707\n",
       "e -0.192731  0.166707 -1.944066  0.777644\n",
       "f  0.400664 -0.223873 -1.359455  0.151622"
      ]
     },
     "execution_count": 208,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.iloc[1:,:-1]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 209,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>E</th>\n",
       "      <th>E</th>\n",
       "      <th>A</th>\n",
       "      <th>C</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>c</th>\n",
       "      <td>-0.973452</td>\n",
       "      <td>-0.973452</td>\n",
       "      <td>0.877961</td>\n",
       "      <td>-2.197159</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>d</th>\n",
       "      <td>-0.335541</td>\n",
       "      <td>-0.335541</td>\n",
       "      <td>0.265707</td>\n",
       "      <td>-0.956252</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>c</th>\n",
       "      <td>-0.973452</td>\n",
       "      <td>-0.973452</td>\n",
       "      <td>0.877961</td>\n",
       "      <td>-2.197159</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "          E         E         A         C\n",
       "c -0.973452 -0.973452  0.877961 -2.197159\n",
       "d -0.335541 -0.335541  0.265707 -0.956252\n",
       "c -0.973452 -0.973452  0.877961 -2.197159"
      ]
     },
     "execution_count": 209,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.iloc[[2,3,2],[0,0,3,2]]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 210,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "-0.9562519827018061"
      ]
     },
     "execution_count": 210,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.iloc[3,2]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "`at[]`与`iat[]`"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 211,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "-2.1971587554005176"
      ]
     },
     "execution_count": 211,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "f.at['c','C']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 212,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.8779607875800123"
      ]
     },
     "execution_count": 212,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.iat[2,3]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "赋值——赋值很简单，直接把上面方法索引到的元素赋值，有以下几种情况：  \n",
    "- 单个值赋给单个元素。简单的赋值，无需解释\n",
    "- 单个值赋给`Series`。索引到的`Series`中每个元素都赋值为该值\n",
    "- 一个一维数组类型赋值给`Series`。如果这个一维数组是`Series`类型，处于数据对齐的原因，必须index与索引到的`Series`一直才可赋值成功；如果只是一个普通的一维数组型，比如一维的`ndarray`，一维的列表，那么只要长度一样，会自动按顺序赋值"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 233,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>E</th>\n",
       "      <th>D</th>\n",
       "      <th>C</th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>a</th>\n",
       "      <td>0.023297</td>\n",
       "      <td>2.789617</td>\n",
       "      <td>0.001195</td>\n",
       "      <td>0.485925</td>\n",
       "      <td>-0.037397</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>b</th>\n",
       "      <td>-0.672584</td>\n",
       "      <td>-0.103210</td>\n",
       "      <td>1.426697</td>\n",
       "      <td>-1.174420</td>\n",
       "      <td>0.603729</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>c</th>\n",
       "      <td>-0.624002</td>\n",
       "      <td>-1.158070</td>\n",
       "      <td>-0.784303</td>\n",
       "      <td>-0.407814</td>\n",
       "      <td>-1.005885</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>d</th>\n",
       "      <td>-0.187537</td>\n",
       "      <td>-0.945113</td>\n",
       "      <td>0.240101</td>\n",
       "      <td>-3.676298</td>\n",
       "      <td>1.298230</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>e</th>\n",
       "      <td>0.510216</td>\n",
       "      <td>1.702823</td>\n",
       "      <td>1.850221</td>\n",
       "      <td>-0.437267</td>\n",
       "      <td>-0.246211</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>f</th>\n",
       "      <td>-0.878987</td>\n",
       "      <td>-0.887268</td>\n",
       "      <td>-0.239877</td>\n",
       "      <td>0.102027</td>\n",
       "      <td>0.820047</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "          E         D         C         A         B\n",
       "a  0.023297  2.789617  0.001195  0.485925 -0.037397\n",
       "b -0.672584 -0.103210  1.426697 -1.174420  0.603729\n",
       "c -0.624002 -1.158070 -0.784303 -0.407814 -1.005885\n",
       "d -0.187537 -0.945113  0.240101 -3.676298  1.298230\n",
       "e  0.510216  1.702823  1.850221 -0.437267 -0.246211\n",
       "f -0.878987 -0.887268 -0.239877  0.102027  0.820047"
      ]
     },
     "execution_count": 233,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df=pd.DataFrame(np.random.randn(6,5),index=list('abcdef'),columns=list('EDCAB'))\n",
    "df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 234,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>E</th>\n",
       "      <th>D</th>\n",
       "      <th>C</th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>a</th>\n",
       "      <td>0.023297</td>\n",
       "      <td>2.789617</td>\n",
       "      <td>0.001195</td>\n",
       "      <td>0.485925</td>\n",
       "      <td>-0.037397</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>b</th>\n",
       "      <td>-0.672584</td>\n",
       "      <td>-0.103210</td>\n",
       "      <td>1.426697</td>\n",
       "      <td>-1.174420</td>\n",
       "      <td>0.603729</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>c</th>\n",
       "      <td>-0.624002</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>-0.784303</td>\n",
       "      <td>-0.407814</td>\n",
       "      <td>-1.005885</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>d</th>\n",
       "      <td>-0.187537</td>\n",
       "      <td>-0.945113</td>\n",
       "      <td>0.240101</td>\n",
       "      <td>-3.676298</td>\n",
       "      <td>1.298230</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>e</th>\n",
       "      <td>0.510216</td>\n",
       "      <td>1.702823</td>\n",
       "      <td>1.850221</td>\n",
       "      <td>-0.437267</td>\n",
       "      <td>-0.246211</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>f</th>\n",
       "      <td>-0.878987</td>\n",
       "      <td>-0.887268</td>\n",
       "      <td>-0.239877</td>\n",
       "      <td>0.102027</td>\n",
       "      <td>0.820047</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "          E         D         C         A         B\n",
       "a  0.023297  2.789617  0.001195  0.485925 -0.037397\n",
       "b -0.672584 -0.103210  1.426697 -1.174420  0.603729\n",
       "c -0.624002  0.000000 -0.784303 -0.407814 -1.005885\n",
       "d -0.187537 -0.945113  0.240101 -3.676298  1.298230\n",
       "e  0.510216  1.702823  1.850221 -0.437267 -0.246211\n",
       "f -0.878987 -0.887268 -0.239877  0.102027  0.820047"
      ]
     },
     "execution_count": 234,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.at['c','D']=0#单个赋值\n",
    "df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 235,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>E</th>\n",
       "      <th>D</th>\n",
       "      <th>C</th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>a</th>\n",
       "      <td>0.023297</td>\n",
       "      <td>2.789617</td>\n",
       "      <td>0.001195</td>\n",
       "      <td>0</td>\n",
       "      <td>-0.037397</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>b</th>\n",
       "      <td>-0.672584</td>\n",
       "      <td>-0.103210</td>\n",
       "      <td>1.426697</td>\n",
       "      <td>0</td>\n",
       "      <td>0.603729</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>c</th>\n",
       "      <td>-0.624002</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>-0.784303</td>\n",
       "      <td>0</td>\n",
       "      <td>-1.005885</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>d</th>\n",
       "      <td>-0.187537</td>\n",
       "      <td>-0.945113</td>\n",
       "      <td>0.240101</td>\n",
       "      <td>0</td>\n",
       "      <td>1.298230</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>e</th>\n",
       "      <td>0.510216</td>\n",
       "      <td>1.702823</td>\n",
       "      <td>1.850221</td>\n",
       "      <td>0</td>\n",
       "      <td>-0.246211</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>f</th>\n",
       "      <td>-0.878987</td>\n",
       "      <td>-0.887268</td>\n",
       "      <td>-0.239877</td>\n",
       "      <td>0</td>\n",
       "      <td>0.820047</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "          E         D         C  A         B\n",
       "a  0.023297  2.789617  0.001195  0 -0.037397\n",
       "b -0.672584 -0.103210  1.426697  0  0.603729\n",
       "c -0.624002  0.000000 -0.784303  0 -1.005885\n",
       "d -0.187537 -0.945113  0.240101  0  1.298230\n",
       "e  0.510216  1.702823  1.850221  0 -0.246211\n",
       "f -0.878987 -0.887268 -0.239877  0  0.820047"
      ]
     },
     "execution_count": 235,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.loc[:,'A']=0#单个值赋值给一个Series\n",
    "df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 236,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>E</th>\n",
       "      <th>D</th>\n",
       "      <th>C</th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>a</th>\n",
       "      <td>0.023297</td>\n",
       "      <td>2.789617</td>\n",
       "      <td>0.001195</td>\n",
       "      <td>0</td>\n",
       "      <td>-0.037397</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>b</th>\n",
       "      <td>-0.672584</td>\n",
       "      <td>-0.103210</td>\n",
       "      <td>1.426697</td>\n",
       "      <td>0</td>\n",
       "      <td>0.603729</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>c</th>\n",
       "      <td>-0.624002</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>-0.784303</td>\n",
       "      <td>0</td>\n",
       "      <td>-1.005885</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>d</th>\n",
       "      <td>9.000000</td>\n",
       "      <td>2.000000</td>\n",
       "      <td>7.000000</td>\n",
       "      <td>3</td>\n",
       "      <td>4.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>e</th>\n",
       "      <td>0.510216</td>\n",
       "      <td>1.702823</td>\n",
       "      <td>1.850221</td>\n",
       "      <td>0</td>\n",
       "      <td>-0.246211</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>f</th>\n",
       "      <td>-0.878987</td>\n",
       "      <td>-0.887268</td>\n",
       "      <td>-0.239877</td>\n",
       "      <td>0</td>\n",
       "      <td>0.820047</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "          E         D         C  A         B\n",
       "a  0.023297  2.789617  0.001195  0 -0.037397\n",
       "b -0.672584 -0.103210  1.426697  0  0.603729\n",
       "c -0.624002  0.000000 -0.784303  0 -1.005885\n",
       "d  9.000000  2.000000  7.000000  3  4.000000\n",
       "e  0.510216  1.702823  1.850221  0 -0.246211\n",
       "f -0.878987 -0.887268 -0.239877  0  0.820047"
      ]
     },
     "execution_count": 236,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.loc['d',:]=pd.Series([3,4,7,2,9],index=list('ABCDE'))\n",
    "df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 237,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>E</th>\n",
       "      <th>D</th>\n",
       "      <th>C</th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>a</th>\n",
       "      <td>0.023297</td>\n",
       "      <td>5</td>\n",
       "      <td>0.001195</td>\n",
       "      <td>0</td>\n",
       "      <td>-0.037397</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>b</th>\n",
       "      <td>-0.672584</td>\n",
       "      <td>5</td>\n",
       "      <td>1.426697</td>\n",
       "      <td>0</td>\n",
       "      <td>0.603729</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>c</th>\n",
       "      <td>-0.624002</td>\n",
       "      <td>5</td>\n",
       "      <td>-0.784303</td>\n",
       "      <td>0</td>\n",
       "      <td>-1.005885</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>d</th>\n",
       "      <td>9.000000</td>\n",
       "      <td>5</td>\n",
       "      <td>7.000000</td>\n",
       "      <td>3</td>\n",
       "      <td>4.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>e</th>\n",
       "      <td>0.510216</td>\n",
       "      <td>5</td>\n",
       "      <td>1.850221</td>\n",
       "      <td>0</td>\n",
       "      <td>-0.246211</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>f</th>\n",
       "      <td>-0.878987</td>\n",
       "      <td>5</td>\n",
       "      <td>-0.239877</td>\n",
       "      <td>0</td>\n",
       "      <td>0.820047</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "          E  D         C  A         B\n",
       "a  0.023297  5  0.001195  0 -0.037397\n",
       "b -0.672584  5  1.426697  0  0.603729\n",
       "c -0.624002  5 -0.784303  0 -1.005885\n",
       "d  9.000000  5  7.000000  3  4.000000\n",
       "e  0.510216  5  1.850221  0 -0.246211\n",
       "f -0.878987  5 -0.239877  0  0.820047"
      ]
     },
     "execution_count": 237,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.loc[:,'D']=np.array([5]*len(df))\n",
    "df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 239,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>E</th>\n",
       "      <th>D</th>\n",
       "      <th>C</th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>a</th>\n",
       "      <td>True</td>\n",
       "      <td>True</td>\n",
       "      <td>True</td>\n",
       "      <td>True</td>\n",
       "      <td>True</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>b</th>\n",
       "      <td>-0.672584</td>\n",
       "      <td>5</td>\n",
       "      <td>1.4267</td>\n",
       "      <td>0</td>\n",
       "      <td>0.603729</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>c</th>\n",
       "      <td>-0.624002</td>\n",
       "      <td>5</td>\n",
       "      <td>-0.784303</td>\n",
       "      <td>0</td>\n",
       "      <td>-1.00589</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>d</th>\n",
       "      <td>9</td>\n",
       "      <td>5</td>\n",
       "      <td>7</td>\n",
       "      <td>3</td>\n",
       "      <td>4</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>e</th>\n",
       "      <td>0.510216</td>\n",
       "      <td>5</td>\n",
       "      <td>1.85022</td>\n",
       "      <td>0</td>\n",
       "      <td>-0.246211</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>f</th>\n",
       "      <td>-0.878987</td>\n",
       "      <td>5</td>\n",
       "      <td>-0.239877</td>\n",
       "      <td>0</td>\n",
       "      <td>0.820047</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "          E     D         C     A         B\n",
       "a      True  True      True  True      True\n",
       "b -0.672584     5    1.4267     0  0.603729\n",
       "c -0.624002     5 -0.784303     0  -1.00589\n",
       "d         9     5         7     3         4\n",
       "e  0.510216     5   1.85022     0 -0.246211\n",
       "f -0.878987     5 -0.239877     0  0.820047"
      ]
     },
     "execution_count": 239,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.loc['a',:]=[True]*5\n",
    "df"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 缺失数据处理  \n",
    "pandas中缺失数据统一用`np.nan`表示，对这些缺失数据有以下一些处理方法：  \n",
    "- `dropna()`，丢掉含有缺失数据的行——参数`how`如果是`any`则是只要改行由缺失数据就丢弃该行；如果是`all`则只有该行全为缺失数据时才丢弃该行\n",
    "- `fillna()`，填充缺失数据——参数`value`给定填充的值\n",
    "- `isna()`，判断是否是缺失数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 242,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>E</th>\n",
       "      <th>D</th>\n",
       "      <th>C</th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "      <th>F</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>c</th>\n",
       "      <td>NaN</td>\n",
       "      <td>5</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>d</th>\n",
       "      <td>9</td>\n",
       "      <td>5</td>\n",
       "      <td>7</td>\n",
       "      <td>3</td>\n",
       "      <td>4</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>e</th>\n",
       "      <td>0.510216</td>\n",
       "      <td>5</td>\n",
       "      <td>1.85022</td>\n",
       "      <td>0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>f</th>\n",
       "      <td>NaN</td>\n",
       "      <td>5</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0</td>\n",
       "      <td>0.820047</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>g</th>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>h</th>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "          E    D        C    A         B    F\n",
       "c       NaN    5      NaN    0       NaN  NaN\n",
       "d         9    5        7    3         4  NaN\n",
       "e  0.510216    5  1.85022    0       NaN  NaN\n",
       "f       NaN    5      NaN    0  0.820047  NaN\n",
       "g       NaN  NaN      NaN  NaN       NaN  NaN\n",
       "h       NaN  NaN      NaN  NaN       NaN  NaN"
      ]
     },
     "execution_count": 242,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df1=df.reindex(index=list(df.index[2:])+['g','h'],columns=list(df.columns)+['F'])\n",
    "df1[df1<0]=np.nan\n",
    "df1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 243,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>E</th>\n",
       "      <th>D</th>\n",
       "      <th>C</th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "      <th>F</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>c</th>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>True</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>d</th>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>e</th>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>True</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>f</th>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>g</th>\n",
       "      <td>True</td>\n",
       "      <td>True</td>\n",
       "      <td>True</td>\n",
       "      <td>True</td>\n",
       "      <td>True</td>\n",
       "      <td>True</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>h</th>\n",
       "      <td>True</td>\n",
       "      <td>True</td>\n",
       "      <td>True</td>\n",
       "      <td>True</td>\n",
       "      <td>True</td>\n",
       "      <td>True</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "       E      D      C      A      B     F\n",
       "c   True  False   True  False   True  True\n",
       "d  False  False  False  False  False  True\n",
       "e  False  False  False  False   True  True\n",
       "f   True  False   True  False  False  True\n",
       "g   True   True   True   True   True  True\n",
       "h   True   True   True   True   True  True"
      ]
     },
     "execution_count": 243,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df1.isna()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 247,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>E</th>\n",
       "      <th>D</th>\n",
       "      <th>C</th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "      <th>F</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>c</th>\n",
       "      <td>NaN</td>\n",
       "      <td>5</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>d</th>\n",
       "      <td>9</td>\n",
       "      <td>5</td>\n",
       "      <td>7</td>\n",
       "      <td>3</td>\n",
       "      <td>4</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>e</th>\n",
       "      <td>0.510216</td>\n",
       "      <td>5</td>\n",
       "      <td>1.85022</td>\n",
       "      <td>0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>f</th>\n",
       "      <td>NaN</td>\n",
       "      <td>5</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0</td>\n",
       "      <td>0.820047</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "          E  D        C  A         B    F\n",
       "c       NaN  5      NaN  0       NaN  NaN\n",
       "d         9  5        7  3         4  NaN\n",
       "e  0.510216  5  1.85022  0       NaN  NaN\n",
       "f       NaN  5      NaN  0  0.820047  NaN"
      ]
     },
     "execution_count": 247,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df1.dropna(how='all')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 248,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>E</th>\n",
       "      <th>D</th>\n",
       "      <th>C</th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "      <th>F</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>c</th>\n",
       "      <td>100.000000</td>\n",
       "      <td>5</td>\n",
       "      <td>100.000000</td>\n",
       "      <td>0</td>\n",
       "      <td>100.000000</td>\n",
       "      <td>100</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>d</th>\n",
       "      <td>9.000000</td>\n",
       "      <td>5</td>\n",
       "      <td>7.000000</td>\n",
       "      <td>3</td>\n",
       "      <td>4.000000</td>\n",
       "      <td>100</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>e</th>\n",
       "      <td>0.510216</td>\n",
       "      <td>5</td>\n",
       "      <td>1.850221</td>\n",
       "      <td>0</td>\n",
       "      <td>100.000000</td>\n",
       "      <td>100</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>f</th>\n",
       "      <td>100.000000</td>\n",
       "      <td>5</td>\n",
       "      <td>100.000000</td>\n",
       "      <td>0</td>\n",
       "      <td>0.820047</td>\n",
       "      <td>100</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>g</th>\n",
       "      <td>100.000000</td>\n",
       "      <td>100</td>\n",
       "      <td>100.000000</td>\n",
       "      <td>100</td>\n",
       "      <td>100.000000</td>\n",
       "      <td>100</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>h</th>\n",
       "      <td>100.000000</td>\n",
       "      <td>100</td>\n",
       "      <td>100.000000</td>\n",
       "      <td>100</td>\n",
       "      <td>100.000000</td>\n",
       "      <td>100</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "            E    D           C    A           B    F\n",
       "c  100.000000    5  100.000000    0  100.000000  100\n",
       "d    9.000000    5    7.000000    3    4.000000  100\n",
       "e    0.510216    5    1.850221    0  100.000000  100\n",
       "f  100.000000    5  100.000000    0    0.820047  100\n",
       "g  100.000000  100  100.000000  100  100.000000  100\n",
       "h  100.000000  100  100.000000  100  100.000000  100"
      ]
     },
     "execution_count": 248,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df1.fillna(value=100)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 操作  \n",
    "一般而言的操作都会排除缺失数据"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 统计操作  \n",
    "统计操作有:**`min`，`max`，`median`，`quantile`，`count`，`sum`，`mean`，`var`，`std`，`cov`**，指定按某个轴计算可以加上axis=0/1，默认是按列计算"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "      <th>C</th>\n",
       "      <th>D</th>\n",
       "      <th>E</th>\n",
       "      <th>F</th>\n",
       "      <th>G</th>\n",
       "      <th>H</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>a</th>\n",
       "      <td>1.114915</td>\n",
       "      <td>-0.332234</td>\n",
       "      <td>-0.133817</td>\n",
       "      <td>1.294784</td>\n",
       "      <td>0.218391</td>\n",
       "      <td>-1.583136</td>\n",
       "      <td>0.879733</td>\n",
       "      <td>-0.226854</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>b</th>\n",
       "      <td>0.319032</td>\n",
       "      <td>-0.645672</td>\n",
       "      <td>0.285107</td>\n",
       "      <td>0.466809</td>\n",
       "      <td>0.500004</td>\n",
       "      <td>1.167855</td>\n",
       "      <td>-0.141746</td>\n",
       "      <td>1.603696</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>c</th>\n",
       "      <td>-1.170743</td>\n",
       "      <td>0.168568</td>\n",
       "      <td>-0.060720</td>\n",
       "      <td>0.480827</td>\n",
       "      <td>0.757633</td>\n",
       "      <td>-0.464112</td>\n",
       "      <td>1.060859</td>\n",
       "      <td>2.417470</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>d</th>\n",
       "      <td>1.199729</td>\n",
       "      <td>0.661571</td>\n",
       "      <td>-0.543229</td>\n",
       "      <td>-2.096887</td>\n",
       "      <td>0.352315</td>\n",
       "      <td>0.028192</td>\n",
       "      <td>-0.368311</td>\n",
       "      <td>-0.675486</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>e</th>\n",
       "      <td>1.001108</td>\n",
       "      <td>0.697587</td>\n",
       "      <td>1.536703</td>\n",
       "      <td>-0.330860</td>\n",
       "      <td>0.469313</td>\n",
       "      <td>-0.351742</td>\n",
       "      <td>1.429091</td>\n",
       "      <td>1.089217</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>f</th>\n",
       "      <td>0.164735</td>\n",
       "      <td>0.163499</td>\n",
       "      <td>0.066771</td>\n",
       "      <td>0.748576</td>\n",
       "      <td>-0.792457</td>\n",
       "      <td>1.893259</td>\n",
       "      <td>0.359123</td>\n",
       "      <td>-1.682346</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "          A         B         C         D         E         F         G  \\\n",
       "a  1.114915 -0.332234 -0.133817  1.294784  0.218391 -1.583136  0.879733   \n",
       "b  0.319032 -0.645672  0.285107  0.466809  0.500004  1.167855 -0.141746   \n",
       "c -1.170743  0.168568 -0.060720  0.480827  0.757633 -0.464112  1.060859   \n",
       "d  1.199729  0.661571 -0.543229 -2.096887  0.352315  0.028192 -0.368311   \n",
       "e  1.001108  0.697587  1.536703 -0.330860  0.469313 -0.351742  1.429091   \n",
       "f  0.164735  0.163499  0.066771  0.748576 -0.792457  1.893259  0.359123   \n",
       "\n",
       "          H  \n",
       "a -0.226854  \n",
       "b  1.603696  \n",
       "c  2.417470  \n",
       "d -0.675486  \n",
       "e  1.089217  \n",
       "f -1.682346  "
      ]
     },
     "execution_count": 1,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import pandas as pd\n",
    "import numpy as np\n",
    "df=pd.DataFrame(np.random.randn(6,8),index=list('abcdef'),columns=list('ABCDEFGH'))\n",
    "df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "a    0.153972\n",
       "b    0.444386\n",
       "c    0.398723\n",
       "d   -0.180263\n",
       "e    0.692552\n",
       "f    0.115145\n",
       "dtype: float64"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.mean(axis=1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "A    0.660070\n",
       "B    0.166033\n",
       "C    0.003025\n",
       "D    0.473818\n",
       "E    0.410814\n",
       "F   -0.161775\n",
       "G    0.619428\n",
       "H    0.431181\n",
       "dtype: float64"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.median()#中值"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "A    0.806483\n",
       "B    0.284384\n",
       "C    0.508633\n",
       "D    1.427893\n",
       "E    0.293294\n",
       "F    1.543026\n",
       "G    0.499928\n",
       "H    2.375448\n",
       "dtype: float64"
      ]
     },
     "execution_count": 28,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.var()#方差，默认归一化参数是N-1（这也是由样本对总体方差的无偏估计），可以通过设置数据自由度参数ddof改变"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "      <th>C</th>\n",
       "      <th>D</th>\n",
       "      <th>E</th>\n",
       "      <th>F</th>\n",
       "      <th>G</th>\n",
       "      <th>H</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>count</th>\n",
       "      <td>6.000000</td>\n",
       "      <td>6.000000</td>\n",
       "      <td>6.000000</td>\n",
       "      <td>6.000000</td>\n",
       "      <td>6.000000</td>\n",
       "      <td>6.000000</td>\n",
       "      <td>6.000000</td>\n",
       "      <td>6.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>mean</th>\n",
       "      <td>0.438129</td>\n",
       "      <td>0.118886</td>\n",
       "      <td>0.191802</td>\n",
       "      <td>0.093875</td>\n",
       "      <td>0.250866</td>\n",
       "      <td>0.115053</td>\n",
       "      <td>0.536458</td>\n",
       "      <td>0.420950</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>std</th>\n",
       "      <td>0.898044</td>\n",
       "      <td>0.533277</td>\n",
       "      <td>0.713185</td>\n",
       "      <td>1.194945</td>\n",
       "      <td>0.541566</td>\n",
       "      <td>1.242186</td>\n",
       "      <td>0.707056</td>\n",
       "      <td>1.541249</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>min</th>\n",
       "      <td>-1.170743</td>\n",
       "      <td>-0.645672</td>\n",
       "      <td>-0.543229</td>\n",
       "      <td>-2.096887</td>\n",
       "      <td>-0.792457</td>\n",
       "      <td>-1.583136</td>\n",
       "      <td>-0.368311</td>\n",
       "      <td>-1.682346</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25%</th>\n",
       "      <td>0.203309</td>\n",
       "      <td>-0.208301</td>\n",
       "      <td>-0.115543</td>\n",
       "      <td>-0.131443</td>\n",
       "      <td>0.251872</td>\n",
       "      <td>-0.436020</td>\n",
       "      <td>-0.016528</td>\n",
       "      <td>-0.563328</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>50%</th>\n",
       "      <td>0.660070</td>\n",
       "      <td>0.166033</td>\n",
       "      <td>0.003025</td>\n",
       "      <td>0.473818</td>\n",
       "      <td>0.410814</td>\n",
       "      <td>-0.161775</td>\n",
       "      <td>0.619428</td>\n",
       "      <td>0.431181</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>75%</th>\n",
       "      <td>1.086463</td>\n",
       "      <td>0.538320</td>\n",
       "      <td>0.230523</td>\n",
       "      <td>0.681638</td>\n",
       "      <td>0.492331</td>\n",
       "      <td>0.882940</td>\n",
       "      <td>1.015577</td>\n",
       "      <td>1.475076</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>max</th>\n",
       "      <td>1.199729</td>\n",
       "      <td>0.697587</td>\n",
       "      <td>1.536703</td>\n",
       "      <td>1.294784</td>\n",
       "      <td>0.757633</td>\n",
       "      <td>1.893259</td>\n",
       "      <td>1.429091</td>\n",
       "      <td>2.417470</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "              A         B         C         D         E         F         G  \\\n",
       "count  6.000000  6.000000  6.000000  6.000000  6.000000  6.000000  6.000000   \n",
       "mean   0.438129  0.118886  0.191802  0.093875  0.250866  0.115053  0.536458   \n",
       "std    0.898044  0.533277  0.713185  1.194945  0.541566  1.242186  0.707056   \n",
       "min   -1.170743 -0.645672 -0.543229 -2.096887 -0.792457 -1.583136 -0.368311   \n",
       "25%    0.203309 -0.208301 -0.115543 -0.131443  0.251872 -0.436020 -0.016528   \n",
       "50%    0.660070  0.166033  0.003025  0.473818  0.410814 -0.161775  0.619428   \n",
       "75%    1.086463  0.538320  0.230523  0.681638  0.492331  0.882940  1.015577   \n",
       "max    1.199729  0.697587  1.536703  1.294784  0.757633  1.893259  1.429091   \n",
       "\n",
       "              H  \n",
       "count  6.000000  \n",
       "mean   0.420950  \n",
       "std    1.541249  \n",
       "min   -1.682346  \n",
       "25%   -0.563328  \n",
       "50%    0.431181  \n",
       "75%    1.475076  \n",
       "max    2.417470  "
      ]
     },
     "execution_count": 29,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.describe()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "      <th>C</th>\n",
       "      <th>D</th>\n",
       "      <th>E</th>\n",
       "      <th>F</th>\n",
       "      <th>G</th>\n",
       "      <th>H</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>A</th>\n",
       "      <td>0.806483</td>\n",
       "      <td>0.086544</td>\n",
       "      <td>0.081265</td>\n",
       "      <td>-0.388161</td>\n",
       "      <td>-0.076298</td>\n",
       "      <td>-0.231599</td>\n",
       "      <td>-0.133731</td>\n",
       "      <td>-0.735046</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>B</th>\n",
       "      <td>0.086544</td>\n",
       "      <td>0.284384</td>\n",
       "      <td>0.087368</td>\n",
       "      <td>-0.442628</td>\n",
       "      <td>-0.003146</td>\n",
       "      <td>-0.061112</td>\n",
       "      <td>0.081475</td>\n",
       "      <td>-0.162995</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>C</th>\n",
       "      <td>0.081265</td>\n",
       "      <td>0.087368</td>\n",
       "      <td>0.508633</td>\n",
       "      <td>0.100647</td>\n",
       "      <td>0.051104</td>\n",
       "      <td>0.002234</td>\n",
       "      <td>0.316046</td>\n",
       "      <td>0.356955</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>D</th>\n",
       "      <td>-0.388161</td>\n",
       "      <td>-0.442628</td>\n",
       "      <td>0.100647</td>\n",
       "      <td>1.427893</td>\n",
       "      <td>-0.149618</td>\n",
       "      <td>-0.063621</td>\n",
       "      <td>0.369827</td>\n",
       "      <td>0.235371</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>E</th>\n",
       "      <td>-0.076298</td>\n",
       "      <td>-0.003146</td>\n",
       "      <td>0.051104</td>\n",
       "      <td>-0.149618</td>\n",
       "      <td>0.293294</td>\n",
       "      <td>-0.388417</td>\n",
       "      <td>0.074771</td>\n",
       "      <td>0.711328</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>F</th>\n",
       "      <td>-0.231599</td>\n",
       "      <td>-0.061112</td>\n",
       "      <td>0.002234</td>\n",
       "      <td>-0.063621</td>\n",
       "      <td>-0.388417</td>\n",
       "      <td>1.543026</td>\n",
       "      <td>-0.450820</td>\n",
       "      <td>-0.553564</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>G</th>\n",
       "      <td>-0.133731</td>\n",
       "      <td>0.081475</td>\n",
       "      <td>0.316046</td>\n",
       "      <td>0.369827</td>\n",
       "      <td>0.074771</td>\n",
       "      <td>-0.450820</td>\n",
       "      <td>0.499928</td>\n",
       "      <td>0.396797</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>H</th>\n",
       "      <td>-0.735046</td>\n",
       "      <td>-0.162995</td>\n",
       "      <td>0.356955</td>\n",
       "      <td>0.235371</td>\n",
       "      <td>0.711328</td>\n",
       "      <td>-0.553564</td>\n",
       "      <td>0.396797</td>\n",
       "      <td>2.375448</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "          A         B         C         D         E         F         G  \\\n",
       "A  0.806483  0.086544  0.081265 -0.388161 -0.076298 -0.231599 -0.133731   \n",
       "B  0.086544  0.284384  0.087368 -0.442628 -0.003146 -0.061112  0.081475   \n",
       "C  0.081265  0.087368  0.508633  0.100647  0.051104  0.002234  0.316046   \n",
       "D -0.388161 -0.442628  0.100647  1.427893 -0.149618 -0.063621  0.369827   \n",
       "E -0.076298 -0.003146  0.051104 -0.149618  0.293294 -0.388417  0.074771   \n",
       "F -0.231599 -0.061112  0.002234 -0.063621 -0.388417  1.543026 -0.450820   \n",
       "G -0.133731  0.081475  0.316046  0.369827  0.074771 -0.450820  0.499928   \n",
       "H -0.735046 -0.162995  0.356955  0.235371  0.711328 -0.553564  0.396797   \n",
       "\n",
       "          H  \n",
       "A -0.735046  \n",
       "B -0.162995  \n",
       "C  0.356955  \n",
       "D  0.235371  \n",
       "E  0.711328  \n",
       "F -0.553564  \n",
       "G  0.396797  \n",
       "H  2.375448  "
      ]
     },
     "execution_count": 33,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.cov()#协方差矩阵"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "A    0.319032\n",
       "B    0.163499\n",
       "C   -0.060720\n",
       "D    0.466809\n",
       "E    0.352315\n",
       "F   -0.351742\n",
       "G    0.359123\n",
       "H   -0.226854\n",
       "Name: 0.4, dtype: float64"
      ]
     },
     "execution_count": 34,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.quantile(q=0.4)#下分位点"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 函数操作  \n",
    "`apply()`函数——与`assign`区别:`assign`是对数据表原有列执行函数操作生成新列，形成新数据表（原数据表不变）；`apply`是对数据表执行函数处理生成新数据表"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "      <th>C</th>\n",
       "      <th>D</th>\n",
       "      <th>E</th>\n",
       "      <th>F</th>\n",
       "      <th>G</th>\n",
       "      <th>H</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>a</th>\n",
       "      <td>1.114915</td>\n",
       "      <td>-0.332234</td>\n",
       "      <td>-0.133817</td>\n",
       "      <td>1.294784</td>\n",
       "      <td>0.218391</td>\n",
       "      <td>-1.583136</td>\n",
       "      <td>0.879733</td>\n",
       "      <td>-0.226854</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>b</th>\n",
       "      <td>1.433947</td>\n",
       "      <td>-0.977907</td>\n",
       "      <td>0.151289</td>\n",
       "      <td>1.761592</td>\n",
       "      <td>0.718395</td>\n",
       "      <td>-0.415281</td>\n",
       "      <td>0.737987</td>\n",
       "      <td>1.376842</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>c</th>\n",
       "      <td>0.263204</td>\n",
       "      <td>-0.809339</td>\n",
       "      <td>0.090569</td>\n",
       "      <td>2.242419</td>\n",
       "      <td>1.476027</td>\n",
       "      <td>-0.879393</td>\n",
       "      <td>1.798846</td>\n",
       "      <td>3.794312</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>d</th>\n",
       "      <td>1.462933</td>\n",
       "      <td>-0.147768</td>\n",
       "      <td>-0.452660</td>\n",
       "      <td>0.145532</td>\n",
       "      <td>1.828343</td>\n",
       "      <td>-0.851201</td>\n",
       "      <td>1.430535</td>\n",
       "      <td>3.118826</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>e</th>\n",
       "      <td>2.464042</td>\n",
       "      <td>0.549819</td>\n",
       "      <td>1.084043</td>\n",
       "      <td>-0.185328</td>\n",
       "      <td>2.297655</td>\n",
       "      <td>-1.202943</td>\n",
       "      <td>2.859626</td>\n",
       "      <td>4.208043</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>f</th>\n",
       "      <td>2.628777</td>\n",
       "      <td>0.713318</td>\n",
       "      <td>1.150814</td>\n",
       "      <td>0.563248</td>\n",
       "      <td>1.505198</td>\n",
       "      <td>0.690316</td>\n",
       "      <td>3.218749</td>\n",
       "      <td>2.525697</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "          A         B         C         D         E         F         G  \\\n",
       "a  1.114915 -0.332234 -0.133817  1.294784  0.218391 -1.583136  0.879733   \n",
       "b  1.433947 -0.977907  0.151289  1.761592  0.718395 -0.415281  0.737987   \n",
       "c  0.263204 -0.809339  0.090569  2.242419  1.476027 -0.879393  1.798846   \n",
       "d  1.462933 -0.147768 -0.452660  0.145532  1.828343 -0.851201  1.430535   \n",
       "e  2.464042  0.549819  1.084043 -0.185328  2.297655 -1.202943  2.859626   \n",
       "f  2.628777  0.713318  1.150814  0.563248  1.505198  0.690316  3.218749   \n",
       "\n",
       "          H  \n",
       "a -0.226854  \n",
       "b  1.376842  \n",
       "c  3.794312  \n",
       "d  3.118826  \n",
       "e  4.208043  \n",
       "f  2.525697  "
      ]
     },
     "execution_count": 41,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.apply(np.cumsum)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "A    2.370472\n",
       "B    1.343259\n",
       "C    2.079932\n",
       "D    3.391671\n",
       "E    1.550090\n",
       "F    3.476396\n",
       "G    1.797402\n",
       "H    4.099816\n",
       "dtype: float64"
      ]
     },
     "execution_count": 50,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.apply(lambda x:x.max()-x.min())"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 直方统计"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0     2\n",
       "1     1\n",
       "2     5\n",
       "3     5\n",
       "4     1\n",
       "5     4\n",
       "6     2\n",
       "7     4\n",
       "8     3\n",
       "9     4\n",
       "10    3\n",
       "11    1\n",
       "dtype: int32"
      ]
     },
     "execution_count": 52,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "s=pd.Series(np.random.randint(1,6,size=12))\n",
    "s"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 56,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "4    3\n",
       "1    3\n",
       "5    2\n",
       "3    2\n",
       "2    2\n",
       "dtype: int64"
      ]
     },
     "execution_count": 56,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "s.value_counts()#生成一个Series，行名是各个不同的数据，元素值为该数据出现的频次"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 字符串处理  \n",
    "`Series`提供了对字符串的处理，可以用于前期的字符串类数据的清洗、格式化等，比如表中可能会有人名、地名列，可能需要对其执行某些操作，诸如化成小写、大写，去除空格，取子字符串，给字符串加上其他修饰，匹配操作字符串（比如对人名中有下划线的改成分隔符等），分割与替换字符串等，各方法主要由`Series.str`提供，详见[文本数据处理](https://pandas.pydata.org/pandas-docs/stable/user_guide/text.html)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 59,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Index(['A', 'B', 'C', 'D', 'E', 'F'], dtype='object')"
      ]
     },
     "execution_count": 59,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.index.str.upper()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 61,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Index(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'], dtype='object')"
      ]
     },
     "execution_count": 61,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.columns.str.lower()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 融合"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 合并——`concat`"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 62,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>C</th>\n",
       "      <th>G</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>a</th>\n",
       "      <td>1.114915</td>\n",
       "      <td>-0.133817</td>\n",
       "      <td>0.879733</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>b</th>\n",
       "      <td>0.319032</td>\n",
       "      <td>0.285107</td>\n",
       "      <td>-0.141746</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>c</th>\n",
       "      <td>-1.170743</td>\n",
       "      <td>-0.060720</td>\n",
       "      <td>1.060859</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>d</th>\n",
       "      <td>1.199729</td>\n",
       "      <td>-0.543229</td>\n",
       "      <td>-0.368311</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>e</th>\n",
       "      <td>1.001108</td>\n",
       "      <td>1.536703</td>\n",
       "      <td>1.429091</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>f</th>\n",
       "      <td>0.164735</td>\n",
       "      <td>0.066771</td>\n",
       "      <td>0.359123</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "          A         C         G\n",
       "a  1.114915 -0.133817  0.879733\n",
       "b  0.319032  0.285107 -0.141746\n",
       "c -1.170743 -0.060720  1.060859\n",
       "d  1.199729 -0.543229 -0.368311\n",
       "e  1.001108  1.536703  1.429091\n",
       "f  0.164735  0.066771  0.359123"
      ]
     },
     "execution_count": 62,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pd.concat([df['A'],df['C'],df['G']],axis=1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 66,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "      <th>C</th>\n",
       "      <th>D</th>\n",
       "      <th>E</th>\n",
       "      <th>F</th>\n",
       "      <th>G</th>\n",
       "      <th>H</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>a</th>\n",
       "      <td>1.114915</td>\n",
       "      <td>-0.332234</td>\n",
       "      <td>-0.133817</td>\n",
       "      <td>1.294784</td>\n",
       "      <td>0.218391</td>\n",
       "      <td>-1.583136</td>\n",
       "      <td>0.879733</td>\n",
       "      <td>-0.226854</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>b</th>\n",
       "      <td>0.319032</td>\n",
       "      <td>-0.645672</td>\n",
       "      <td>0.285107</td>\n",
       "      <td>0.466809</td>\n",
       "      <td>0.500004</td>\n",
       "      <td>1.167855</td>\n",
       "      <td>-0.141746</td>\n",
       "      <td>1.603696</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>d</th>\n",
       "      <td>1.199729</td>\n",
       "      <td>0.661571</td>\n",
       "      <td>-0.543229</td>\n",
       "      <td>-2.096887</td>\n",
       "      <td>0.352315</td>\n",
       "      <td>0.028192</td>\n",
       "      <td>-0.368311</td>\n",
       "      <td>-0.675486</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>e</th>\n",
       "      <td>1.001108</td>\n",
       "      <td>0.697587</td>\n",
       "      <td>1.536703</td>\n",
       "      <td>-0.330860</td>\n",
       "      <td>0.469313</td>\n",
       "      <td>-0.351742</td>\n",
       "      <td>1.429091</td>\n",
       "      <td>1.089217</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "          A         B         C         D         E         F         G  \\\n",
       "a  1.114915 -0.332234 -0.133817  1.294784  0.218391 -1.583136  0.879733   \n",
       "b  0.319032 -0.645672  0.285107  0.466809  0.500004  1.167855 -0.141746   \n",
       "d  1.199729  0.661571 -0.543229 -2.096887  0.352315  0.028192 -0.368311   \n",
       "e  1.001108  0.697587  1.536703 -0.330860  0.469313 -0.351742  1.429091   \n",
       "\n",
       "          H  \n",
       "a -0.226854  \n",
       "b  1.603696  \n",
       "d -0.675486  \n",
       "e  1.089217  "
      ]
     },
     "execution_count": 66,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pd.concat([df[:2],df[3:-1]],axis=0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 70,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>0</th>\n",
       "      <th>1</th>\n",
       "      <th>2</th>\n",
       "      <th>0</th>\n",
       "      <th>1</th>\n",
       "      <th>2</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     0    1    2    0    1    2\n",
       "0  1.0  1.0  1.0  0.0  0.0  0.0\n",
       "1  1.0  1.0  1.0  0.0  0.0  0.0\n",
       "2  1.0  1.0  1.0  0.0  0.0  0.0"
      ]
     },
     "execution_count": 70,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df1=pd.DataFrame(np.ones([3,3]))\n",
    "df2=pd.DataFrame(np.zeros([3,3]))\n",
    "pd.concat([df1,df2],axis=1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 71,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>0</th>\n",
       "      <th>1</th>\n",
       "      <th>2</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     0    1    2\n",
       "0  1.0  1.0  1.0\n",
       "1  1.0  1.0  1.0\n",
       "2  1.0  1.0  1.0\n",
       "0  0.0  0.0  0.0\n",
       "1  0.0  0.0  0.0\n",
       "2  0.0  0.0  0.0"
      ]
     },
     "execution_count": 71,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pd.concat([df1,df2])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 连接——`merge`  \n",
    "`merge`是SQL风格的连接，可以指定连接的键（不太了解SQL），参考[数据库风格连接/融合](https://pandas.pydata.org/pandas-docs/stable/user_guide/merging.html#database-style-dataframe-or-named-series-joining-merging)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 103,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>name</th>\n",
       "      <th>Math</th>\n",
       "      <th>English</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>LiYX</td>\n",
       "      <td>121</td>\n",
       "      <td>83</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>TangKS</td>\n",
       "      <td>106</td>\n",
       "      <td>80</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     name  Math  English\n",
       "0    LiYX   121       83\n",
       "1  TangKS   106       80"
      ]
     },
     "execution_count": 103,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "left=pd.DataFrame({'name':['LiYX','TangKS','Somebody'],'Math':[121,106,142]})\n",
    "right=pd.DataFrame({'name':['LiYX','TangKS','Anybody'],'English':[83,80,72]})\n",
    "pd.merge(left,right)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 107,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>name</th>\n",
       "      <th>Math</th>\n",
       "      <th>English</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>LiYX</td>\n",
       "      <td>121.0</td>\n",
       "      <td>83.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>TangKS</td>\n",
       "      <td>106.0</td>\n",
       "      <td>80.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>Somebody</td>\n",
       "      <td>142.0</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>Anybody</td>\n",
       "      <td>NaN</td>\n",
       "      <td>72.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "       name   Math  English\n",
       "0      LiYX  121.0     83.0\n",
       "1    TangKS  106.0     80.0\n",
       "2  Somebody  142.0      NaN\n",
       "3   Anybody    NaN     72.0"
      ]
     },
     "execution_count": 107,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#指定了融合使用的相同列，如果融合列在两个表中名称不一样，比如left表中第一列叫name，right表中第一列叫Name，\n",
    "#则可以merge(left,right,left_on='name',right_on='Name')\n",
    "pd.merge(left,right,on='name',how='outer')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "> 函数有`how`参数{‘left’,'right','inner','outer'}，默认是使用'inner'；\n",
    "- left表示保留左边表的融合列的值\n",
    "- right表示保留右边表的融合列的值\n",
    "- inner表示保留两边表融合列的公有值\n",
    "- outer表示保留两边表融合列的所有值"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 追加数据——`append`"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 112,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "      <th>C</th>\n",
       "      <th>D</th>\n",
       "      <th>E</th>\n",
       "      <th>F</th>\n",
       "      <th>G</th>\n",
       "      <th>H</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>a</th>\n",
       "      <td>1.114915</td>\n",
       "      <td>-0.332234</td>\n",
       "      <td>-0.133817</td>\n",
       "      <td>1.294784</td>\n",
       "      <td>0.218391</td>\n",
       "      <td>-1.583136</td>\n",
       "      <td>0.879733</td>\n",
       "      <td>-0.226854</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>b</th>\n",
       "      <td>0.319032</td>\n",
       "      <td>-0.645672</td>\n",
       "      <td>0.285107</td>\n",
       "      <td>0.466809</td>\n",
       "      <td>0.500004</td>\n",
       "      <td>1.167855</td>\n",
       "      <td>-0.141746</td>\n",
       "      <td>1.603696</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>c</th>\n",
       "      <td>-1.170743</td>\n",
       "      <td>0.168568</td>\n",
       "      <td>-0.060720</td>\n",
       "      <td>0.480827</td>\n",
       "      <td>0.757633</td>\n",
       "      <td>-0.464112</td>\n",
       "      <td>1.060859</td>\n",
       "      <td>2.417470</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>d</th>\n",
       "      <td>1.199729</td>\n",
       "      <td>0.661571</td>\n",
       "      <td>-0.543229</td>\n",
       "      <td>-2.096887</td>\n",
       "      <td>0.352315</td>\n",
       "      <td>0.028192</td>\n",
       "      <td>-0.368311</td>\n",
       "      <td>-0.675486</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>e</th>\n",
       "      <td>1.001108</td>\n",
       "      <td>0.697587</td>\n",
       "      <td>1.536703</td>\n",
       "      <td>-0.330860</td>\n",
       "      <td>0.469313</td>\n",
       "      <td>-0.351742</td>\n",
       "      <td>1.429091</td>\n",
       "      <td>1.089217</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>f</th>\n",
       "      <td>0.164735</td>\n",
       "      <td>0.163499</td>\n",
       "      <td>0.066771</td>\n",
       "      <td>0.748576</td>\n",
       "      <td>-0.792457</td>\n",
       "      <td>1.893259</td>\n",
       "      <td>0.359123</td>\n",
       "      <td>-1.682346</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>c</th>\n",
       "      <td>-1.170743</td>\n",
       "      <td>0.168568</td>\n",
       "      <td>-0.060720</td>\n",
       "      <td>0.480827</td>\n",
       "      <td>0.757633</td>\n",
       "      <td>-0.464112</td>\n",
       "      <td>1.060859</td>\n",
       "      <td>2.417470</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "          A         B         C         D         E         F         G  \\\n",
       "a  1.114915 -0.332234 -0.133817  1.294784  0.218391 -1.583136  0.879733   \n",
       "b  0.319032 -0.645672  0.285107  0.466809  0.500004  1.167855 -0.141746   \n",
       "c -1.170743  0.168568 -0.060720  0.480827  0.757633 -0.464112  1.060859   \n",
       "d  1.199729  0.661571 -0.543229 -2.096887  0.352315  0.028192 -0.368311   \n",
       "e  1.001108  0.697587  1.536703 -0.330860  0.469313 -0.351742  1.429091   \n",
       "f  0.164735  0.163499  0.066771  0.748576 -0.792457  1.893259  0.359123   \n",
       "c -1.170743  0.168568 -0.060720  0.480827  0.757633 -0.464112  1.060859   \n",
       "\n",
       "          H  \n",
       "a -0.226854  \n",
       "b  1.603696  \n",
       "c  2.417470  \n",
       "d -0.675486  \n",
       "e  1.089217  \n",
       "f -1.682346  \n",
       "c  2.417470  "
      ]
     },
     "execution_count": 112,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "s=df.loc['c']\n",
    "df.append(s)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 113,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "      <th>C</th>\n",
       "      <th>D</th>\n",
       "      <th>E</th>\n",
       "      <th>F</th>\n",
       "      <th>G</th>\n",
       "      <th>H</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1.114915</td>\n",
       "      <td>-0.332234</td>\n",
       "      <td>-0.133817</td>\n",
       "      <td>1.294784</td>\n",
       "      <td>0.218391</td>\n",
       "      <td>-1.583136</td>\n",
       "      <td>0.879733</td>\n",
       "      <td>-0.226854</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0.319032</td>\n",
       "      <td>-0.645672</td>\n",
       "      <td>0.285107</td>\n",
       "      <td>0.466809</td>\n",
       "      <td>0.500004</td>\n",
       "      <td>1.167855</td>\n",
       "      <td>-0.141746</td>\n",
       "      <td>1.603696</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>-1.170743</td>\n",
       "      <td>0.168568</td>\n",
       "      <td>-0.060720</td>\n",
       "      <td>0.480827</td>\n",
       "      <td>0.757633</td>\n",
       "      <td>-0.464112</td>\n",
       "      <td>1.060859</td>\n",
       "      <td>2.417470</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1.199729</td>\n",
       "      <td>0.661571</td>\n",
       "      <td>-0.543229</td>\n",
       "      <td>-2.096887</td>\n",
       "      <td>0.352315</td>\n",
       "      <td>0.028192</td>\n",
       "      <td>-0.368311</td>\n",
       "      <td>-0.675486</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>1.001108</td>\n",
       "      <td>0.697587</td>\n",
       "      <td>1.536703</td>\n",
       "      <td>-0.330860</td>\n",
       "      <td>0.469313</td>\n",
       "      <td>-0.351742</td>\n",
       "      <td>1.429091</td>\n",
       "      <td>1.089217</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>0.164735</td>\n",
       "      <td>0.163499</td>\n",
       "      <td>0.066771</td>\n",
       "      <td>0.748576</td>\n",
       "      <td>-0.792457</td>\n",
       "      <td>1.893259</td>\n",
       "      <td>0.359123</td>\n",
       "      <td>-1.682346</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>-1.170743</td>\n",
       "      <td>0.168568</td>\n",
       "      <td>-0.060720</td>\n",
       "      <td>0.480827</td>\n",
       "      <td>0.757633</td>\n",
       "      <td>-0.464112</td>\n",
       "      <td>1.060859</td>\n",
       "      <td>2.417470</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "          A         B         C         D         E         F         G  \\\n",
       "0  1.114915 -0.332234 -0.133817  1.294784  0.218391 -1.583136  0.879733   \n",
       "1  0.319032 -0.645672  0.285107  0.466809  0.500004  1.167855 -0.141746   \n",
       "2 -1.170743  0.168568 -0.060720  0.480827  0.757633 -0.464112  1.060859   \n",
       "3  1.199729  0.661571 -0.543229 -2.096887  0.352315  0.028192 -0.368311   \n",
       "4  1.001108  0.697587  1.536703 -0.330860  0.469313 -0.351742  1.429091   \n",
       "5  0.164735  0.163499  0.066771  0.748576 -0.792457  1.893259  0.359123   \n",
       "6 -1.170743  0.168568 -0.060720  0.480827  0.757633 -0.464112  1.060859   \n",
       "\n",
       "          H  \n",
       "0 -0.226854  \n",
       "1  1.603696  \n",
       "2  2.417470  \n",
       "3 -0.675486  \n",
       "4  1.089217  \n",
       "5 -1.682346  \n",
       "6  2.417470  "
      ]
     },
     "execution_count": 113,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.append(s,ignore_index=True)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 分组  \n",
    "通过`groupby`函数分组，通常分组操作会进行以下几步（或部分）：  \n",
    "- 依据某种规则将数据分组\n",
    "- 对各组执行特定的函数\n",
    "- 对处理后的各组组合成一个数据结构\n",
    "\n",
    "给定一个场景，假设要根据某个地区的取样点（比如照片上的一个像素点）的几个特征A,B,C,D（比如r,g,b值或是其他波段辐射值）来将该点划分为植被与非植被点，每一条记录表示一个取样点的数据，表的第一列为该取样点所属区域（1,2,3,4），第二列为该取样点实际所属类别（1表示植被，0表示非植被），第三、四、五、六列为其四个特征值，随机构造一个这样的数据："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 116,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>region</th>\n",
       "      <th>label</th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "      <th>C</th>\n",
       "      <th>D</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>4</td>\n",
       "      <td>0</td>\n",
       "      <td>-0.868372</td>\n",
       "      <td>0.440958</td>\n",
       "      <td>1.179302</td>\n",
       "      <td>-1.764009</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3</td>\n",
       "      <td>0</td>\n",
       "      <td>-0.811300</td>\n",
       "      <td>-0.973034</td>\n",
       "      <td>0.152061</td>\n",
       "      <td>-0.796966</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>-0.615989</td>\n",
       "      <td>-2.400283</td>\n",
       "      <td>-1.029210</td>\n",
       "      <td>1.877748</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "      <td>-0.044621</td>\n",
       "      <td>0.564440</td>\n",
       "      <td>-0.045122</td>\n",
       "      <td>0.709791</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>4</td>\n",
       "      <td>1</td>\n",
       "      <td>0.927877</td>\n",
       "      <td>0.921141</td>\n",
       "      <td>-0.812888</td>\n",
       "      <td>1.570141</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1.081696</td>\n",
       "      <td>0.424961</td>\n",
       "      <td>-0.428897</td>\n",
       "      <td>0.964864</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>-0.760294</td>\n",
       "      <td>2.049091</td>\n",
       "      <td>0.539042</td>\n",
       "      <td>1.013368</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>-0.378985</td>\n",
       "      <td>-0.505555</td>\n",
       "      <td>-1.455270</td>\n",
       "      <td>0.497252</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>-0.236419</td>\n",
       "      <td>1.808747</td>\n",
       "      <td>0.502212</td>\n",
       "      <td>0.698097</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "      <td>0.278327</td>\n",
       "      <td>-0.111409</td>\n",
       "      <td>-1.544815</td>\n",
       "      <td>2.162358</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "    region  label         A         B         C         D\n",
       "1        4      0 -0.868372  0.440958  1.179302 -1.764009\n",
       "2        3      0 -0.811300 -0.973034  0.152061 -0.796966\n",
       "3        2      1 -0.615989 -2.400283 -1.029210  1.877748\n",
       "4        3      1 -0.044621  0.564440 -0.045122  0.709791\n",
       "5        4      1  0.927877  0.921141 -0.812888  1.570141\n",
       "6        1      0  1.081696  0.424961 -0.428897  0.964864\n",
       "7        1      1 -0.760294  2.049091  0.539042  1.013368\n",
       "8        1      0 -0.378985 -0.505555 -1.455270  0.497252\n",
       "9        2      1 -0.236419  1.808747  0.502212  0.698097\n",
       "10       3      1  0.278327 -0.111409 -1.544815  2.162358"
      ]
     },
     "execution_count": 116,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "s1=pd.Series(np.random.randint(1,5,size=10),index=list(range(1,11)),name='region')\n",
    "s2=pd.Series(np.random.randint(0,2,size=10),index=list(range(1,11)),name='label')\n",
    "dff=pd.DataFrame(np.random.randn(10,4),index=list(range(1,11)),columns=list('ABCD'))\n",
    "df=pd.concat([s1,s2,dff],axis=1)\n",
    "df"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "按照区域分组，求各区域的四个特征平均值:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 126,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "      <th>C</th>\n",
       "      <th>D</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>region</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>-0.019194</td>\n",
       "      <td>0.656166</td>\n",
       "      <td>-0.448375</td>\n",
       "      <td>0.825161</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>-0.426204</td>\n",
       "      <td>-0.295768</td>\n",
       "      <td>-0.263499</td>\n",
       "      <td>1.287923</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>-0.192531</td>\n",
       "      <td>-0.173334</td>\n",
       "      <td>-0.479292</td>\n",
       "      <td>0.691728</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0.029753</td>\n",
       "      <td>0.681050</td>\n",
       "      <td>0.183207</td>\n",
       "      <td>-0.096934</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "               A         B         C         D\n",
       "region                                        \n",
       "1      -0.019194  0.656166 -0.448375  0.825161\n",
       "2      -0.426204 -0.295768 -0.263499  1.287923\n",
       "3      -0.192531 -0.173334 -0.479292  0.691728\n",
       "4       0.029753  0.681050  0.183207 -0.096934"
      ]
     },
     "execution_count": 126,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.groupby('region').mean().loc[:,['A','B','C','D']]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "按照区域和标签分组，求各区域植被点与非植被点的四个特征中值:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 127,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "      <th>C</th>\n",
       "      <th>D</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>region</th>\n",
       "      <th>label</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th rowspan=\"2\" valign=\"top\">1</th>\n",
       "      <th>0</th>\n",
       "      <td>0.351356</td>\n",
       "      <td>-0.040297</td>\n",
       "      <td>-0.942084</td>\n",
       "      <td>0.731058</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>-0.760294</td>\n",
       "      <td>2.049091</td>\n",
       "      <td>0.539042</td>\n",
       "      <td>1.013368</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <th>1</th>\n",
       "      <td>-0.426204</td>\n",
       "      <td>-0.295768</td>\n",
       "      <td>-0.263499</td>\n",
       "      <td>1.287923</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th rowspan=\"2\" valign=\"top\">3</th>\n",
       "      <th>0</th>\n",
       "      <td>-0.811300</td>\n",
       "      <td>-0.973034</td>\n",
       "      <td>0.152061</td>\n",
       "      <td>-0.796966</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0.116853</td>\n",
       "      <td>0.226516</td>\n",
       "      <td>-0.794968</td>\n",
       "      <td>1.436074</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th rowspan=\"2\" valign=\"top\">4</th>\n",
       "      <th>0</th>\n",
       "      <td>-0.868372</td>\n",
       "      <td>0.440958</td>\n",
       "      <td>1.179302</td>\n",
       "      <td>-1.764009</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0.927877</td>\n",
       "      <td>0.921141</td>\n",
       "      <td>-0.812888</td>\n",
       "      <td>1.570141</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                     A         B         C         D\n",
       "region label                                        \n",
       "1      0      0.351356 -0.040297 -0.942084  0.731058\n",
       "       1     -0.760294  2.049091  0.539042  1.013368\n",
       "2      1     -0.426204 -0.295768 -0.263499  1.287923\n",
       "3      0     -0.811300 -0.973034  0.152061 -0.796966\n",
       "       1      0.116853  0.226516 -0.794968  1.436074\n",
       "4      0     -0.868372  0.440958  1.179302 -1.764009\n",
       "       1      0.927877  0.921141 -0.812888  1.570141"
      ]
     },
     "execution_count": 127,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.groupby(['region','label']).median()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "> 更多分组以及分组后的数据过滤、排序、索引、迭代、统计、函数处理等等高级操作和一些语法糖，参考[分组：分割、处理、组合](https://pandas.pydata.org/pandas-docs/stable/user_guide/groupby.html)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 重构  \n",
    "这一部分我不太了解有什么必要，无非是多重指标——`DataFrame.stack()`把列标签压缩成为底层的index标签，使index成为多重标签；`DataFrame.unstack()`把index多重标签的底层标签展开成为列标签。`DataFrame.pivot_table(values,index,colums)`可以将一个表中某几列数据重新排列成一个新表，新表中数值取自于`values`给定的数据列，index标签取自于`index`参数指定的列（如果指定多列则是多重index），`columns`指定的列是新表的列标签，按照指定的行、列标签在原表的指定数据列中找到数据，有可能找到多个数据应进入新表的同一单元格，这时候用`aggfunc`指定的函数对这些数据计算然后填入新表"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 139,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>one</th>\n",
       "      <th>two</th>\n",
       "      <th>three</th>\n",
       "      <th>four</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>a</th>\n",
       "      <td>1.597058</td>\n",
       "      <td>-0.412226</td>\n",
       "      <td>-0.424387</td>\n",
       "      <td>0.622932</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>b</th>\n",
       "      <td>-0.014065</td>\n",
       "      <td>-0.484030</td>\n",
       "      <td>1.741110</td>\n",
       "      <td>-0.211923</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>c</th>\n",
       "      <td>0.110455</td>\n",
       "      <td>-0.786324</td>\n",
       "      <td>-0.632652</td>\n",
       "      <td>0.436670</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "        one       two     three      four\n",
       "a  1.597058 -0.412226 -0.424387  0.622932\n",
       "b -0.014065 -0.484030  1.741110 -0.211923\n",
       "c  0.110455 -0.786324 -0.632652  0.436670"
      ]
     },
     "execution_count": 139,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df1=pd.DataFrame(np.random.randn(3,4),index=list('abc'),columns=['one','two','three','four'])\n",
    "df1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 140,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "a  one      1.597058\n",
       "   two     -0.412226\n",
       "   three   -0.424387\n",
       "   four     0.622932\n",
       "b  one     -0.014065\n",
       "   two     -0.484030\n",
       "   three    1.741110\n",
       "   four    -0.211923\n",
       "c  one      0.110455\n",
       "   two     -0.786324\n",
       "   three   -0.632652\n",
       "   four     0.436670\n",
       "dtype: float64"
      ]
     },
     "execution_count": 140,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df2=df1.stack()\n",
    "df2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 141,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>one</th>\n",
       "      <th>two</th>\n",
       "      <th>three</th>\n",
       "      <th>four</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>a</th>\n",
       "      <td>1.597058</td>\n",
       "      <td>-0.412226</td>\n",
       "      <td>-0.424387</td>\n",
       "      <td>0.622932</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>b</th>\n",
       "      <td>-0.014065</td>\n",
       "      <td>-0.484030</td>\n",
       "      <td>1.741110</td>\n",
       "      <td>-0.211923</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>c</th>\n",
       "      <td>0.110455</td>\n",
       "      <td>-0.786324</td>\n",
       "      <td>-0.632652</td>\n",
       "      <td>0.436670</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "        one       two     three      four\n",
       "a  1.597058 -0.412226 -0.424387  0.622932\n",
       "b -0.014065 -0.484030  1.741110 -0.211923\n",
       "c  0.110455 -0.786324 -0.632652  0.436670"
      ]
     },
     "execution_count": 141,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df2.unstack()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 169,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Province</th>\n",
       "      <th>City</th>\n",
       "      <th>Indicator</th>\n",
       "      <th>Stats</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>JX</td>\n",
       "      <td>NC</td>\n",
       "      <td>GDP</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>JX</td>\n",
       "      <td>NC</td>\n",
       "      <td>Income</td>\n",
       "      <td>4</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>JX</td>\n",
       "      <td>YT</td>\n",
       "      <td>GDP</td>\n",
       "      <td>0.3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>JX</td>\n",
       "      <td>YT</td>\n",
       "      <td>Income</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>HB</td>\n",
       "      <td>WH</td>\n",
       "      <td>GDP</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>HB</td>\n",
       "      <td>WH</td>\n",
       "      <td>Income</td>\n",
       "      <td>6</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>HB</td>\n",
       "      <td>XY</td>\n",
       "      <td>GDP</td>\n",
       "      <td>1.5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>HB</td>\n",
       "      <td>XY</td>\n",
       "      <td>Income</td>\n",
       "      <td>5.5</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "  Province City Indicator Stats\n",
       "0       JX   NC       GDP     1\n",
       "1       JX   NC    Income     4\n",
       "2       JX   YT       GDP   0.3\n",
       "3       JX   YT    Income     3\n",
       "4       HB   WH       GDP     2\n",
       "5       HB   WH    Income     6\n",
       "6       HB   XY       GDP   1.5\n",
       "7       HB   XY    Income   5.5"
      ]
     },
     "execution_count": 169,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df3=pd.DataFrame([['JX']*4+['HB']*4,['NC']*2+['YT']*2+['WH']*2+['XY']*2,['GDP','Income']*4,[1,4,0.3,3,2,6,1.5,5.5]])\n",
    "df3=df3.T\n",
    "df3.columns=['Province','City','Indicator','Stats']\n",
    "df3"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 186,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead tr th {\n",
       "        text-align: left;\n",
       "    }\n",
       "\n",
       "    .dataframe thead tr:last-of-type th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th colspan=\"2\" halign=\"left\">Stats</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th></th>\n",
       "      <th>Indicator</th>\n",
       "      <th>GDP</th>\n",
       "      <th>Income</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Province</th>\n",
       "      <th>City</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th rowspan=\"2\" valign=\"top\">HB</th>\n",
       "      <th>WH</th>\n",
       "      <td>2.0</td>\n",
       "      <td>6.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>XY</th>\n",
       "      <td>1.5</td>\n",
       "      <td>5.5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th rowspan=\"2\" valign=\"top\">JX</th>\n",
       "      <th>NC</th>\n",
       "      <td>1.0</td>\n",
       "      <td>4.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>YT</th>\n",
       "      <td>0.3</td>\n",
       "      <td>3.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "              Stats       \n",
       "Indicator       GDP Income\n",
       "Province City             \n",
       "HB       WH     2.0    6.0\n",
       "         XY     1.5    5.5\n",
       "JX       NC     1.0    4.0\n",
       "         YT     0.3    3.0"
      ]
     },
     "execution_count": 186,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df4=df3.pivot_table(values=['Stats'],index=['Province','City'],columns=['Indicator'],aggfunc='sum')\n",
    "df5=df3.pivot_table(values=['Stats'],index=['Province','City'],columns=['Indicator'],aggfunc='count')\n",
    "df4/df5"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "> `aggfunc`指定对行标签、列标签相同的元素（这个例子中行标签相同表示同一个省同一个市，列标签相同表示同是GDP或者收入）执行什么运算，比如此例中`sum`表示求和，`count`表示计算个数，两种方式得到的表相除一下就是均值；原本可以直接使用`aggfunc=‘mean'`（这也是默认选项），但是不知道出于什么原因这种方法一直报错"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**补充：**  \n",
    "关于`pivot_table`的作用我觉得可能是：真实情况下收集数据很可能是制作一张表，收集数据，比如某个集体中的个体的籍贯、收入、支出、职业、年龄、性别，显然这样一张表中可能有很多的重复的数据，许多人可能来自同一地区、同一行业，更不用说性别了，这是实际收集数据的方式，但是使用的时候肯定还得重新划分行列生成新的更好分析的表——比如行标签是各个年龄，列标签是收入、支出均值，那么可以反映各年龄的收入状况，各年龄段的收入支出比，可能进一步可以得到各年龄段的消费观念的差别；行标签是地区，列标签是年龄均值，可以反映各地区的人口老龄化状况等等。`pivot_table`作为实际收集到的数据到用于处理、分析数据之间的处理手段之一。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 时间序列分析  \n",
    "pandas中提供时间序列，通过`pd.date_range`函数可以生成一个DatetimeIndex，其可作为`Series`或者`DataFrame`的行标签从而生成时间相关数据；pandas中提供了很多有关时序数据的处理方法，包括时间周期重采样、时区转换等，具体参考[时间序列/日期功能](https://pandas.pydata.org/pandas-docs/stable/user_guide/timeseries.html)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 200,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2019-02-09 17:00:00    0.984090\n",
       "2019-02-09 17:00:01   -0.488370\n",
       "2019-02-09 17:00:02   -1.325405\n",
       "2019-02-09 17:00:03   -0.251773\n",
       "2019-02-09 17:00:04    0.443207\n",
       "2019-02-09 17:00:05   -0.738500\n",
       "2019-02-09 17:00:06   -0.058704\n",
       "Freq: S, dtype: float64"
      ]
     },
     "execution_count": 200,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#第一个参数指定起始时间，periods指定生成几个时间周期，freq指定时间间隔（这里S是秒）\n",
    "rng=pd.date_range('2/9/2019 17:00',periods=10000,freq='S')\n",
    "ts=pd.Series(np.random.randn(len(rng)),index=rng)\n",
    "ts.head(7)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 201,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2019-02-09 17:00:00   -29.522340\n",
       "2019-02-09 17:05:00     2.760265\n",
       "2019-02-09 17:10:00   -10.911778\n",
       "2019-02-09 17:15:00    21.151833\n",
       "2019-02-09 17:20:00    17.099364\n",
       "Freq: 5T, dtype: float64"
      ]
     },
     "execution_count": 201,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "ts.resample('5Min').sum().head()#时间重采样为5分钟，即时间间隔变为5分钟"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 208,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "      <th>C</th>\n",
       "      <th>D</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2019-02-09 17:00:00+00:00</th>\n",
       "      <td>-0.227061</td>\n",
       "      <td>2.485386</td>\n",
       "      <td>1.035848</td>\n",
       "      <td>-0.390622</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-02-09 18:00:00+00:00</th>\n",
       "      <td>-0.454118</td>\n",
       "      <td>-1.257559</td>\n",
       "      <td>-0.976032</td>\n",
       "      <td>-1.053162</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-02-09 19:00:00+00:00</th>\n",
       "      <td>0.373896</td>\n",
       "      <td>-1.103140</td>\n",
       "      <td>0.563577</td>\n",
       "      <td>-0.856358</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-02-09 20:00:00+00:00</th>\n",
       "      <td>1.452531</td>\n",
       "      <td>-1.014787</td>\n",
       "      <td>0.136430</td>\n",
       "      <td>0.150036</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-02-09 21:00:00+00:00</th>\n",
       "      <td>0.196119</td>\n",
       "      <td>0.389609</td>\n",
       "      <td>-1.012335</td>\n",
       "      <td>-0.608025</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                                  A         B         C         D\n",
       "2019-02-09 17:00:00+00:00 -0.227061  2.485386  1.035848 -0.390622\n",
       "2019-02-09 18:00:00+00:00 -0.454118 -1.257559 -0.976032 -1.053162\n",
       "2019-02-09 19:00:00+00:00  0.373896 -1.103140  0.563577 -0.856358\n",
       "2019-02-09 20:00:00+00:00  1.452531 -1.014787  0.136430  0.150036\n",
       "2019-02-09 21:00:00+00:00  0.196119  0.389609 -1.012335 -0.608025"
      ]
     },
     "execution_count": 208,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "rng=pd.date_range('2/9/2019 17:00',periods=100,freq='H')\n",
    "ts=pd.DataFrame(np.random.randn(len(rng),4),index=rng,columns=list('ABCD'))\n",
    "#指定时区，docstring里面没有具体都有哪些时区，这里UTC可能是指美国中部时间？\n",
    "ts_utc=ts.tz_localize('UTC')\n",
    "ts_utc.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 229,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "      <th>C</th>\n",
       "      <th>D</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2019-02-09 12:00:00-05:00</th>\n",
       "      <td>-0.227061</td>\n",
       "      <td>2.485386</td>\n",
       "      <td>1.035848</td>\n",
       "      <td>-0.390622</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-02-09 13:00:00-05:00</th>\n",
       "      <td>-0.454118</td>\n",
       "      <td>-1.257559</td>\n",
       "      <td>-0.976032</td>\n",
       "      <td>-1.053162</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-02-09 14:00:00-05:00</th>\n",
       "      <td>0.373896</td>\n",
       "      <td>-1.103140</td>\n",
       "      <td>0.563577</td>\n",
       "      <td>-0.856358</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-02-09 15:00:00-05:00</th>\n",
       "      <td>1.452531</td>\n",
       "      <td>-1.014787</td>\n",
       "      <td>0.136430</td>\n",
       "      <td>0.150036</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-02-09 16:00:00-05:00</th>\n",
       "      <td>0.196119</td>\n",
       "      <td>0.389609</td>\n",
       "      <td>-1.012335</td>\n",
       "      <td>-0.608025</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                                  A         B         C         D\n",
       "2019-02-09 12:00:00-05:00 -0.227061  2.485386  1.035848 -0.390622\n",
       "2019-02-09 13:00:00-05:00 -0.454118 -1.257559 -0.976032 -1.053162\n",
       "2019-02-09 14:00:00-05:00  0.373896 -1.103140  0.563577 -0.856358\n",
       "2019-02-09 15:00:00-05:00  1.452531 -1.014787  0.136430  0.150036\n",
       "2019-02-09 16:00:00-05:00  0.196119  0.389609 -1.012335 -0.608025"
      ]
     },
     "execution_count": 229,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "ts_utc.tz_convert('US/Eastern').head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 绘图  \n",
    "pandas中绘图无非就是对matplotlib重新封装了一下，介绍下基本用法，深入的可以用matplotlb实现，关于pandas绘图更详细的介绍参考[pandas可视化](https://pandas.pydata.org/pandas-docs/stable/user_guide/visualization.html)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 233,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.axes._subplots.AxesSubplot at 0x1d83d87add8>"
      ]
     },
     "execution_count": 233,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "#Series绘图\n",
    "ts=pd.Series(np.random.randn(1000),index=pd.date_range('2/9/2019 17:00',periods=1000))\n",
    "ts=ts.cumsum()\n",
    "ts.plot()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 235,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.legend.Legend at 0x1d83d7e6e48>"
      ]
     },
     "execution_count": 235,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "#DataFrame绘制\n",
    "df=pd.DataFrame(np.random.randn(1000,4),index=ts.index,columns=list('ABCD'))\n",
    "df=df.cumsum()\n",
    "df.plot()#直接plot则会把DataFrame当成多个Series绘制出每一个Series\n",
    "plt.legend(loc='best')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 239,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.axes._subplots.AxesSubplot at 0x1d83ea37160>"
      ]
     },
     "execution_count": 239,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "df.plot.scatter('A','C')#还可以指定绘制的两个列分别作为x,y坐标"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### I/O读写  \n",
    "对应各种格式的读写就是`read_格式`与`to_格式`："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 264,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>time</th>\n",
       "      <th>amp</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>15</th>\n",
       "      <td>-1.08000e-05</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>16</th>\n",
       "      <td>-1.07990e-05</td>\n",
       "      <td>4.47035e-08</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>17</th>\n",
       "      <td>-1.07980e-05</td>\n",
       "      <td>4.47035e-08</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>18</th>\n",
       "      <td>-1.07970e-05</td>\n",
       "      <td>4.47035e-08</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>19</th>\n",
       "      <td>-1.07960e-05</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "            time          amp\n",
       "15  -1.08000e-05            2\n",
       "16  -1.07990e-05  4.47035e-08\n",
       "17  -1.07980e-05  4.47035e-08\n",
       "18  -1.07970e-05  4.47035e-08\n",
       "19  -1.07960e-05            2"
      ]
     },
     "execution_count": 264,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df=pd.read_csv('T0006CH1.CSV',header=None)\n",
    "df=df[15:]\n",
    "df.columns=['time','amp']\n",
    "df.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "这里有一个问题是读入的数据都是`str`类型而不是数值类型，无法进一步处理。可以用Series的`astype`函数将字符串类型转化为数值类型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 272,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.axes._subplots.AxesSubplot at 0x1d84341da90>"
      ]
     },
     "execution_count": 272,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "df['time']=df['time'].astype(np.float64)\n",
    "df['amp']=df['amp'].astype(np.float64)\n",
    "df.plot('time','amp')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 274,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>time</th>\n",
       "      <th>amp</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>-0.000011</td>\n",
       "      <td>2.000000e+00</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>-0.000011</td>\n",
       "      <td>4.470350e-08</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>-0.000011</td>\n",
       "      <td>4.470350e-08</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>-0.000011</td>\n",
       "      <td>4.470350e-08</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>-0.000011</td>\n",
       "      <td>2.000000e+00</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "       time           amp\n",
       "1 -0.000011  2.000000e+00\n",
       "2 -0.000011  4.470350e-08\n",
       "3 -0.000011  4.470350e-08\n",
       "4 -0.000011  4.470350e-08\n",
       "5 -0.000011  2.000000e+00"
      ]
     },
     "execution_count": 274,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.index=list(range(1,len(df)+1))\n",
    "df.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 275,
   "metadata": {},
   "outputs": [],
   "source": [
    "df.to_excel('test.xlsx',sheet_name='Sheet1',header=True)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.0"
  },
  "toc": {
   "base_numbering": 1,
   "nav_menu": {},
   "number_sections": true,
   "sideBar": true,
   "skip_h1_title": false,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": false,
   "toc_position": {
    "height": "calc(100% - 180px)",
    "left": "10px",
    "top": "150px",
    "width": "307.2px"
   },
   "toc_section_display": true,
   "toc_window_display": true
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
